Floyd 全源最短路
三重循环:枚举中转点 k,看"绕道 k"能不能让 i→j 更短。O(n³),能求任意两点最短路。
一、互动演示:中转点 k 如何更新距离矩阵
4 个点的距离矩阵。每点一次“下一个中转点 k”,黄色行列是 k;若 dist[i][k]+dist[k][j] < dist[i][j] 则更新(绿色)。
点“下一个中转点 k”,从 k=1 开始。∞ 表示不可达。
二、参考代码(注意 k 必须在最外层)
for (int k = 1; k <= n; k++) // 中转点:最外层!
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j]; // 绕道 k 更短就更新
初始化:对角线 0,其余 ∞,读边填 min。k 放最外层是 Floyd 的灵魂(本质是以 k 为阶段的 DP)。