几种最短路算法对比
!> 众所周知,关于SPFA,它死了。
几种最短路算法对比:
名称 | 时间复杂度 | 优点 | 缺点 | 使用情况 |
---|---|---|---|---|
Floyd-Warshall | \(O(n ^ 3)\) | 仅有的多源最短路径算法(即跑一遍Floyd能求出每个点到其它点的距离)、其核心代码就 5 行 | 时间复杂度过高 | 多源最短路、对时间复杂度没要求 |
Dijkstra | \(O(n ^ 2)\) | 时间复杂度比较低,具有良好的可扩展性 | 编码复杂度非常高、不能处理负权,即边的权值是负数的情况(跟它用的是贪心有关) | 稠密图且是单源最短路、对时间复杂度有要求 |
Bellman-Ford | \(O(nm)\) | 跟Dijkstra时间复杂度互有胜负,有时还是 Dijkstra赢了 | 稀疏图 | |
SPFA | 最坏也是 \(O(nm)\) | 优化版Bellman-Ford | 众所周知,它死了 | 别用 |
BFS | \(O(n + m)\) | 思路简单 | 只能处理等权图或无权图 | 等权图/无权图 |
注:\(n\) 为点的个数,\(m\) 为边的个数。