From 5a5eeb055c21fa21c0798f475a0e4f5c9c20e417 Mon Sep 17 00:00:00 2001 From: lingkerio whiher Date: Wed, 11 Dec 2024 21:49:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(graph/shortest-path.md):=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E5=85=B3=E4=BA=8E=20floyd=E7=AE=97=E6=B3=95=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E7=BB=B4=E7=9C=81=E7=95=A5=E5=AF=B9=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=97=A0=E5=BD=B1=E5=93=8D=20=E7=9A=84=E8=AF=81=E6=98=8E=20(#6?= =?UTF-8?q?051)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(shortest-path.md):修正关于floyd算法第一维省略对结果无影响的证明 原本的证明中提到所谓交叉点上的元素应该是f[k][k]而不是f[x][y]。而证明的主体逻辑也不是正确的,其中提到"我们注意到 f[k][x][y] 的涵义是第一维为 k-1 这一行和这一列的所有元素的最小值",但f[k][x][y]的含义是第一维为 k-1 这一行和这一列的两个元素的和与f[k-1][x][y]之间的较小值。整个证明逻辑似乎都因此错误了。 * fix(shortest-path.md): fix format * fix(shortest-path.md): fix format * style: format markdown files with remark-lint * fix(shortest-path.md): fix markdown format Co-authored-by: Tifa <62847935+Tiphereth-A@users.noreply.github.com> * fix(shortest-path.md): fix format about whitespace --------- Co-authored-by: 24OI-bot <15963390+24OI-bot@users.noreply.github.com> Co-authored-by: Tifa <62847935+Tiphereth-A@users.noreply.github.com> --- docs/graph/shortest-path.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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