diff --git a/docs/graph/shortest-path.md b/docs/graph/shortest-path.md index 6360e6f1d54a1..92dc469b000ca 100644 --- a/docs/graph/shortest-path.md +++ b/docs/graph/shortest-path.md @@ -71,11 +71,9 @@ author: du33169, lingkerio, Taoran-01 因为第一维对结果无影响,我们可以发现数组的第一维是可以省略的,于是可以直接改成 `f[x][y] = min(f[x][y], f[x][k]+f[k][y])`。 ???+ note "证明第一维对结果无影响" - 我们注意到如果放在一个给定第一维 `k` 二维数组中,`f[x][k]` 与 `f[k][y]` 在某一行和某一列。而 `f[x][y]` 则是该行和该列的交叉点上的元素。 + 对于给定的 `k`,当更新 `f[k][x][y]` 时,涉及的元素总是来自 `f[k-1]` 数组的第 `k` 行和第 `k` 列。然后我们可以发现,对于给定的 `k`,当更新 `f[k][k][y]` 或 `f[k][x][k]`,总是不会发生数值更新,因为按照公式 `f[k][k][y] = min(f[k-1][k][y], f[k-1][k][k]+f[k-1][k][y])`,`f[k-1][k][k]` 为 0,因此这个值总是 `f[k-1][k][y]`,对于 `f[k][x][k]` 的证明类似。 - 现在我们需要证明将 `f[k][x][y]` 直接在原地更改也不会更改它的结果:我们注意到 `f[k][x][y]` 的涵义是第一维为 `k-1` 这一行和这一列的所有元素的最小值,包含了 `f[k-1][x][y]`,那么在原地进行更改也不会改变最小值的值,因为如果将该三维矩阵压缩为二维,则所求结果 `f[x][y]` 一开始即为原 `f[k-1][x][y]` 的值,最后依然会成为该行和该列的最小值。 - - 故可以压缩。 + 因此,如果省略第一维,在给定的 `k` 下,每个元素的更新中使用到的元素都没有在这次迭代中更新,因此第一维的省略并不会影响结果。 === "C++" ```cpp