代码与动画 FLOYD–WARSHALL
Floyd 最短路径.
逐个允许顶点作为中间节点,更新任意两点之间的最短距离。
时间 O(V³)空间 O(V²)有向图 · 距离矩阵
原理与执行逻辑
用距离矩阵保存任意两点之间的最短距离,依次允许更多节点作为中间点。处理 k 时比较原路径与经过 k 的两段路径之和。
执行步骤
- 对角线初始化为 0,已有边写入权重,未连接位置为 ∞。
- 将 k 作为最外层循环,依次选取允许的新中间节点。
- 对每对 i、j 更新 d[i][j] = min(d[i][j], d[i][k] + d[k][j])。
- 全部中间节点处理后输出完整最短距离矩阵。
关键理解
处理完 k 后,矩阵已考虑中间点取自前 k + 1 个顶点的路径。k 必须位于最外层以维持这个阶段含义;Demo 使用非负权。
简短示例
A→B 为 3、B→C 为 2、A→C 为 9。允许 B 作为中间节点后,A→C 更新为 min(9, 3 + 2) = 5。
代码与执行动画
STEP 0 / 74function floyd(n, edges) { const d = Array.from({length: n}, (_, i) => Array.from({length: n}, (_, j) => i === j ? 0 : Infinity)); for (const {from, to, weight} of edges) d[from][to] = Math.min(d[from][to], weight); for (let k = 0; k < n; k++) { for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]); } } } return d;}当前数据正在操作已访问 / 命中标记 / 指针
0
初始化距离矩阵
行是起点,列是终点;已有边写入权重,对角线为 0,其余为 ∞。
配置演示数据
应用后重新生成执行过程,可单步观察结果。
Floyd 最短路径的操作规则
固定四个顶点 A–D,输入非负权;矩阵行表示起点,列表示终点,∞ 表示不可达。每步显示 d[i][k] + d[k][j] 与原距离的比较。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
计算所有城市对的最短距离,再统计阈值以内的邻居。
- 扩展练习743. 网络延迟时间打开题目
比较 Floyd 全源计算与 Dijkstra 单源计算,并提取起点对应距离行。