形式陈述
在有限有向实权最短路 公理库 最短路问题 Shortest-path problem 在有限有向实权图中寻找源点到各顶点的最小有向游走成本。 模型中,Floyd–Warshall 同时求所有有序顶点对的距离。给顶点编号 1 , … , n ,令 D ( k ) [ i , j ] 为只允许中间顶点来自 { 1 , … , k } 的有向游走最小成本,则
D ( k ) [ i , j ] = min { D ( k − 1 ) [ i , j ] , D ( k − 1 ) [ i , k ] + D ( k − 1 ) [ k , j ] } . 初值为直接弧权,D ( 0 ) [ i , i ] = 0 ,无直接弧时为 + ∞ ;若存在反平行弧,它们分别占矩阵的两个方向。按 k 外层原地更新矩阵即可,时间 Θ ( n 3 ) 、空间 Θ ( n 2 ) 。若最终某个 D [ k , k ] < 0 ,则 k 位于或可往返到一个负权有向圈。进一步地,只有满足 D [ i , k ] < + ∞ 、D [ k , k ] < 0 、D [ k , j ] < + ∞ 的点对 ( i , j ) 才有真实距离 − ∞ ;普通有限矩阵不会自动传播这个标记。
直觉
Floyd–Warshall 依次允许更多顶点作为路径内部节点。第 k 轮后,d [ i ] [ j ] 表示只使用前 k 个允许中间点的最短距离;最优路径要么不经过新开放的 k ,要么可在第一次或最后一次经过 k 处拆成 i ⇝ k 与 k ⇝ j 两段。这个状态定义解释了为何三层循环中 k 必须在最外层。
图片加载失败 Floyd–Warshall 的矩阵动态规划更新
例子与边界
设 d [ 1 , 2 ] = 3 、d [ 2 , 3 ] = − 1 、d [ 1 , 3 ] = 5 。开放顶点 2 作为中间点后,递推把 d [ 1 , 3 ] 更新为 2 ;负边没有破坏算法,因为状态仍比较有限条允许中间点的游走。若另有 3 → 2 权 − 2 ,则 2 → 3 → 2 为负圈,所有能到达该圈且还能从圈到达的点对都应标为 − ∞ 。
循环顺序必须让 k 在最外层;随意交换三重循环会混入尚未开放的中间点,破坏状态不变量。要恢复具体有向路,可维护 next 或 predecessor 矩阵。存在相关负圈时,仅返回更新结束后的有限数值会误导,必须按可达条件传播 − ∞ 或单独报告受影响点对。
推论与应用
Floyd–Warshall 是以允许的中间顶点集合为阶段的动态规划 公理库 动态规划 Dynamic programming 在有限或良基的状态依赖上复用已计算结果的算法设计范式。 。当输入用稠密矩阵表示,或确实需要全部 n 2 个点对答案时,固定的 O ( n 3 ) 扫描常比逐源稀疏算法更合适;“稠密”是表示与复杂度条件,不改变输入的有向实权模型。布尔半环上同一递推得到传递闭包,替换代数运算还可计算最宽路等代数路径问题。
当图稀疏且无负环时,Johnson 算法 公理库 Johnson 全源最短路算法 Johnson's algorithm · Johnson all-pairs shortest paths 以 Bellman–Ford 势函数把无负环图重赋为非负边权,再重复 Dijkstra 求稀疏图全源最短路。 以势函数重赋权后从每点运行 Dijkstra,时间随 m 而非固定 n 3 ;它与 Floyd–Warshall 的稠密矩阵 DP 是不同成本区域。布尔可达或小整数状态的某些矩阵转移可由四俄罗斯/字级并行 公理库 四俄罗斯方法与字级并行 Four Russians method · bit parallelism · broadword programming 把状态切成可查表微块,或在一个机器字内并行处理多位,从而省去对数因子。 分块加速,但必须说明字长和有限块类型,不能把普通实权 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。