Skip to content

算法Algorithm

Floyd–Warshall 算法

施工中 · 内容逐步修订

Floyd–Warshall algorithm

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

形式陈述 ​

在有限有向实权最短路模型中,Floyd–Warshall 同时处理所有有序顶点对。先假设图中没有负权有向圈,给顶点编号 1,…,n。令 D(k)[i,j] 为中间顶点只能来自 {1,…,k} 的游走最小成本,不可达时为 +∞。删去重复顶点之间的非负圈不会增加成本,因此有限最小值可由简单路达到;i=j 时可取成本零的空路。递推为

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

最优简单路要么不含新的内部顶点 k,要么恰好经过它一次,此时拆出的两段都只用先前允许的内部顶点。初值在对角线上包含空路的成本零,其余位置初始为 +∞,再对每条弧取直接权重的最小值。这样也适用于平行弧和自环:反向弧占不同单元,负自环不会被对角线的零覆盖。

按 k 外层原地更新即可。无负圈时 D[k,k]=0,本轮的第 k 行与列不会改变,因此原地读到的两个操作数仍符合上一阶段的递推。精确加法、比较和矩阵访问均为常数成本时,若输入已有各点对最小弧权的矩阵,n≥1 的时间为 Θ(n3);若输入是 m 条可含平行弧的记录,还须扫描它们构造初始矩阵,总时间为 Θ(m+n3)。距离矩阵占 Θ(n2) 空间;空图直接返回空矩阵。实现以可达标记处理 +∞,避免机器哨兵相加溢出。

负圈检测使用同一有限矩阵更新,但上述“受限游走最小值”解释此时不再成立:可反复绕负圈的游走成本没有有限下界。更新中的每个有限值仍有实际游走见证,最终存在 D[k,k]<0 当且仅当图中存在负圈。负对角元给出负闭合游走;反过来,一条简单负圈可按其内部顶点的阶段被递推拼接出来。

若要输出扩展实数距离,先保存更新结束时的可达标记 R[i,j]≡D[i,j]<+∞ 及负对角元集合 K。对每个点对,若存在 k∈K 使 R[i,k] 与 R[k,j] 均为真,就标记 δ(i,j)=−∞;其余点对保留有限距离或 +∞。标记成本仍为 O(n3),应使用保存的布尔可达关系,而不对新写入的正、负无穷做普通加法。

直觉

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

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

距离积的倍增归约改以允许弧数1、2、4、…为阶段,给出另一种连接APSP与矩阵计算的方式;反向三层图可直接由本页算法求值。该等价说明速度怎样传递,不把某个时代的APSP困难性假设作为其证明前提。

参考资料
  • 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。
关系图谱10 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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