最短路径介绍
最短路径是图论中的算法,下面将列举几个常见的算法:
🚗 一、单源最短路径(一个起点到所有点)
1. Dijkstra 算法
-
适用图:非负权图(不能有负权边)
-
思路:贪心 + 最小堆(优先队列)
-
时间复杂度:
-
使用堆:O(E log V)
-
不使用堆:O(V²)
-
📌 示例应用:地图导航、网络最短延迟
2. Bellman-Ford 算法
-
适用图:有负权边(可以有负数,但不能有负环)
-
思路:动态规划,最多进行 V-1 次松弛
-
时间复杂度:O(VE)
📌 示例应用:货币汇率套利检测、网络传输带延迟和奖励
3. SPFA(队列优化的 Bellman-Ford)
-
适用图:有负权边,无负环
-
特点:在稀疏图上比 Bellman-Ford 更快
-
复杂度:理论上最坏 O(VE),平均很快
🌐 二、多源最短路径(任意两点之间)
1. Floyd-Warshall 算法
-
适用图:稠密图、小规模图(V 不太大)
-
思路:动态规划
-
时间复杂度:O(V³)
📌 示例应用:城市之间最短路线查询
🧭 三、特殊图的最短路径
1. BFS(广度优先搜索)
-
适用图:无权图(或所有边权为 1)
-
特点:可以用来找图中最短步数(如迷宫最短路)
-
复杂度:O(V + E)
2. A*(A Star)算法
-
适用图:路径规划,有启发式信息(如地图中到目标的直线距离)
-
特点:速度快,常用于游戏和 AI 导航
3. 0-1 BFS
-
适用图:边权只有 0 或 1
-
思路:用双端队列 deque 实现
🎯 总结对比表:
方法 | 负边 | 负环 | 适用图类型 | 时间复杂度 |
---|---|---|---|---|
Dijkstra | ❌ | ❌ | 非负权图 | O(E log V) |
Bellman-Ford | ✅ | ❌ | 有负边图 | O(VE) |
SPFA | ✅ | ❌ | 有负边图 | 平均 O(V+E) |
Floyd-Warshall | ✅ | ❌ | 多源稠密图 | O(V³) |
BFS | ✔️(无权) | - | 所有边权为1 | O(V + E) |
0-1 BFS | ✅(0/1) | ❌ | 0/1 权图 | O(V + E) |
A* | ❌ | ❌ | 有启发函数 | 看启发函数 |