由 Hack Floyd 问题引出的 Floyd 的正确性证明
摘自一篇博客,突然想写了,但是确实和原题做法也没啥关系(其实也有点关系)。感觉 Floyd 的动态规划还是非常高深的,我好像以前并没有完全理解清楚他在做什么,即使我做了灾后重建一题。
主要是一个结论:当我们求 \(d_{i,j}\) 的时候,枚举了中转点 \(k\),当我们枚举的 \(k\) 的编号等于 \(path(u,v)\) 上编号最大的点的时候,我们就完成了更新。
我们使用数学归纳法:当我们求 \(d_{i,j}\) 的时候,我们要证明 \(d_{i,k}\) 与 \(d_{k,j}\) 的答案都是最优的。我们记 \(path(i,k)\) 和 \(path(k,j)\) 上的点分别为 \(k1\) 和 \(k2\)。由于 \(k1<k\) 且 \(k2<k\),那么由归纳,我们的 \(d_{i,k}\) 和 \(d_{k,j}\) 就是最优的。又因为对于任意的 \(i\),满足 \(d_{i,i}=0\),于是我们就证明完毕了。

浙公网安备 33010602011771号