GESP8 · 图论

Floyd 全源最短路

三重循环:枚举中转点 k,看"绕道 k"能不能让 i→j 更短。O(n³),能求任意两点最短路。

一、互动演示:中转点 k 如何更新距离矩阵

4 个点的距离矩阵。每点一次“下一个中转点 k”,黄色行列是 k;若 dist[i][k]+dist[k][j] < dist[i][j] 则更新(绿色)。

二、参考代码(注意 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)。