Skip to content

Floyd–Warshall 算法

Floyd–Warshall algorithm

以允许的中间顶点集合为阶段计算全部顶点对最短路。

条目类型
算法

形式陈述

有限有向实权最短路模型中,Floyd–Warshall 同时求所有有序顶点对的距离。给顶点编号 1,,n,令 D(k)[i,j] 为只允许中间顶点来自 {1,,k} 的有向游走最小成本,则

D(k)[i,j]=min{D(k1)[i,j],D(k1)[i,k]+D(k1)[k,j]}.

初值为直接弧权,D(0)[i,i]=0,无直接弧时为 +;若存在反平行弧,它们分别占矩阵的两个方向。按 k 外层原地更新矩阵即可,时间 Θ(n3)、空间 Θ(n2)。若最终某个 D[k,k]<0,则 k 位于或可往返到一个负权有向圈。进一步地,只有满足 D[i,k]<+D[k,k]<0D[k,j]<+ 的点对 (i,j) 才有真实距离 ;普通有限矩阵不会自动传播这个标记。

直觉

Floyd–Warshall 依次允许更多顶点作为路径内部节点。第 k 轮后,d[i][j] 表示只使用前 k 个允许中间点的最短距离;最优路径要么不经过新开放的 k,要么可在第一次或最后一次经过 k 处拆成 ikkj 两段。这个状态定义解释了为何三层循环中 k 必须在最外层。

Floyd–Warshall 的矩阵动态规划更新
例子与边界

d[1,2]=3d[2,3]=1d[1,3]=5。开放顶点 2 作为中间点后,递推把 d[1,3] 更新为 2;负边没有破坏算法,因为状态仍比较有限条允许中间点的游走。若另有 322,则 232 为负圈,所有能到达该圈且还能从圈到达的点对都应标为

循环顺序必须让 k 在最外层;随意交换三重循环会混入尚未开放的中间点,破坏状态不变量。要恢复具体有向路,可维护 next 或 predecessor 矩阵。存在相关负圈时,仅返回更新结束后的有限数值会误导,必须按可达条件传播 或单独报告受影响点对。

推论与应用

Floyd–Warshall 是以允许的中间顶点集合为阶段的动态规划。当输入用稠密矩阵表示,或确实需要全部 n2 个点对答案时,固定的 O(n3) 扫描常比逐源稀疏算法更合适;“稠密”是表示与复杂度条件,不改变输入的有向实权模型。布尔半环上同一递推得到传递闭包,替换代数运算还可计算最宽路等代数路径问题。

当图稀疏且无负环时,Johnson 算法以势函数重赋权后从每点运行 Dijkstra,时间随 m 而非固定 n3;它与 Floyd–Warshall 的稠密矩阵 DP 是不同成本区域。布尔可达或小整数状态的某些矩阵转移可由四俄罗斯/字级并行分块加速,但必须说明字长和有限块类型,不能把普通实权 min-plus 更新无条件压成位运算。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,§23.2, the Floyd–Warshall algorithm。
  • Robert W. Floyd, “Algorithm 97: Shortest Path,” Communications of the ACM 5(6), 1962, p. 345。
关系图谱7 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

实现的抽象