最短路问题的各种求法(一)
最短路问题分为
- 单源最短路(从一个点到另一个点的最短路)
- 多源汇最短路(起点终点不确定)
图分为稀疏图和稠密图
- 稀疏图 m与n在一个数量级上
- 稠密图 m与n^2在一个数量级上
求最短路问题的各种方法
- 单源最短路
当所有边权都是正数用Dijkstra算法
Dijkstra算法
- 朴素版Dijkstra算法
应用于稠密图 时间复杂度 O(n^2) 空间复杂度 O(n^2) - 堆优化版的Dijkstra算法(小根堆)
应用于稀疏图 时间复杂度 O(mlogn) 空间复杂度 O(mn)
当存在负权边用Bellman-Ford算法或者spfa算法
Bellman-Ford算法
时间复杂度O(nm) 空间复杂度O(m+n)
PS:有边数限制的最短路只能用 Bellman-Ford算法
spfa算法
spfa算法是对于Bellman-Ford算法的优化
时间复杂度一般是O(m) 最坏是O(nm) 空间复杂度O(m+n)
PS:一般来说很多问题都可以用spfa算法但是它的时间复杂度最坏是O(nm)所以会有被卡的风险
- 多源汇最短路
Floyd算法
时间复杂度O(n^3) 空间复杂度O(n^2)
这是我最喜欢的算法了,因为实在是太简单了三重循环直接搞定!!!