讲解要点
- k 的含义:第 k 轮结束后,允许经过的中转点范围扩大了一步。
- 更新条件:如果
d[i][k] + d[k][j]比原来的d[i][j]小,就替换为更短路径。 - 适用场景:求任意两点之间的最短路,图规模不大时尤其方便。
- 复杂度:三重循环,时间复杂度
O(n^3),空间复杂度通常为O(n^2)。
C++ 核心代码
const int INF = 0x3f3f3f3f;
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (d[i][k] != INF && d[k][j] != INF) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}