最短路模板
2019-11-24 21:30:47
本文总阅读量次
最短路问题中有很多的算法,dijkstra bellman_ford spfa floyd
初学真的好难记(更不用说去看算法导论的详细证明了)。y总也总结了很多模板链接,自己再来总结一下加深记忆。另外安利y总算法课,讲的真的很好,我觉得收获很大,而且价格也很良心😂😂。
Dijkstra算法
朴素版dijkstra
适合稠密图
思路
1 | 集合S为已经确定最短路径的点集。 |
时间复杂度分析
寻找路径最短的点:O(n^2)
加入集合S:O(n)
更新距离:O(m)
所以总的时间复杂度为O(n^2)
具体题目
稠密图用邻接矩阵存。
1 |
|
堆优化版dijkstra适合稀疏图
思路
1 | 堆优化版的dijkstra是对朴素版dijkstra进行了优化,在朴素版dijkstra中时间复杂度最高的寻找距离最短的点O(n^2)可以使用最小堆优化。 |
时间复杂度分析
寻找路径最短的点:O(n)
加入集合S:O(n)
更新距离:O(mlogn)
具体题目
1 |
|
Bellman_ford算法
Bellman_ford可以解决有负权的图
思路
1 | 循环n次,在每一次的循环当中,遍历所有的边 a->b 权重为 w ,dist[b] = min(dist[b], dist[a] + w)。严格证明待看 |
时间复杂度分析
循环n次,每一次遍历m条边,所以时间复杂度为:O(nm)
因为这道题在每一次迭代的过程中需要遍历所有的边,所以y总直接用的结构体数组存的。
1 |
|
spfa算法
思路
1 | spfa算法实际上是对bellman_ford算法的优化。 |
时间复杂度
最好:O(m)
最坏:O(nm)
具体题目
1 |
|
spfa判断负环
思路
1 |