最短路径Shortest paths

寻找路径边权之和最小的路线。先区分单源与所有顶点对,再判断是否存在负权边或会影响目标的负环。

怎样选择#

  • V 为顶点数,E 为边数。无权图或各边权相同且为正时,BFS 已能求单源最短路径。
  • 负权边不等于负环。若起点能到达负环、且负环能到达终点,这对起终点没有有限的最短距离;其他顶点对不一定受影响。
  • Dijkstra 与 Bellman–Ford 解决单源问题;Floyd–Warshall 一次计算全部顶点对,不能只按复杂度大小直接比较。

算法对照#

具体算法问题与前提时间复杂度辅助空间选择与取舍
Dijkstra单源;边权非负索引二叉堆 O((V+E)log⁡V)O((V+E)\log V)索引堆 O(V)O(V);重复入堆版可 O(V+E)O(V+E)确定最近的未处理顶点后不再回退;一般负权边会破坏这一保证。
Bellman–Ford单源;允许负权边O(VE)O(VE)O(V)O(V),保存距离与前驱反复松弛边,并检测从源点可达的负环;成本通常高于非负边权上的 Dijkstra。
Floyd–Warshall所有顶点对;允许负权边时间 O(V3)O(V^{3}),空间 O(V2)O(V^{2})O(V2)O(V^{2}),保存全对距离;路径恢复再用 O(V2)O(V^{2})适合顶点数适中的图;检查负对角项后,还需区分哪些顶点对受负环影响。

左右滑动查看完整对照。点击算法名称,查看原理、约束和实现。

参考资料#

MIT 6.006 · Dijkstra’s Algorithm

MIT 6.006 · Bellman–Ford

Boost Graph · Floyd–Warshall

3 个概念