for (k = 1; k <= n; k++) {
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
f[k][i][j] = min(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][k][j]);
}
}
}
蒟蒻看不懂oiwiki的证明:
我们注意到如果放在一个给定第一维 k 二维数组中,f[i][k] 与 f[k][j] 在某一行和某一列。而 f[i][j] 则是该行和该列的交叉点上的元素。
现在我们需要证明将 f[k][i][j] 直接在原地更改也不会更改它的结果:我们注意到 f[k][i][j] 的涵义是第一维为 k-1 这一行和这一列的所有元素的最小值,包含了 f[k-1][i][j],那么我在原地进行更改也不会改变最小值的值,因为如果将该三维矩阵压缩为二维,则所求结果 f[i][j] 一开始即为原 f[k-1][i][j] 的值,最后依然会成为该行和该列的最小值。
故可以压缩。
有什么更加易懂的解释吗