Skip to content

Commit

Permalink
fix(graph/shortest-path.md): 修正关于 floyd算法第一维省略对结果无影响 的证明 (OI-wiki#6051)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
3 people authored Dec 11, 2024
1 parent ef12ce5 commit 5a5eeb0
Showing 1 changed file with 2 additions and 4 deletions.
6 changes: 2 additions & 4 deletions docs/graph/shortest-path.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5a5eeb0

Please sign in to comment.