我试图了解贝尔曼 - 福特算法,但我仍然坚持正确性的证明。 我使用过Wikipedia,但我根本无法理解这个证据。我在Youtube上找不到任何有用的东西。 希望你们中的任何人都能简单解释一下。此页面"Bellman-ford correctness can we do better"未回答我的问题。
谢谢。
答案 0 :(得分:0)
尝试使用此链接查看THE BELLMAN-FORD算法主题:https://class.coursera.org/algo2-003/lecture/preview。
答案 1 :(得分:0)
让我们从一个没有负循环的图的动态规划的角度来看问题。
我们可以将动态规划的记忆表可视化如下:
列代表节点,行代表更新步骤(节点 0 是源节点),从一个步骤中的一个框指向下一步中另一个框的箭头是 min
更新(步骤 0 是初始化)。
我们从所有最短路径中选择一条路径并说明为什么它是正确的。让我们选择 0 -> 3 -> 2 -> 4 -> 5。它是从 0 到 5 的最短路径,否则我们可以选择任何其他路径。我们可以通过归约来证明正确性。初始是源0,很明显,0和自身的距离应该是0,最短的。我们假设 0 -> 3 -> 2 是 0 和 2 之间的最短路径,我们将证明 0 -> 3 -> 2 -> 4 是第三次迭代后 0 和 4 之间的最短路径。< /p>
首先,我们证明在第三次迭代后,节点 4 必须固定/收紧。如果节点 4 不固定,则意味着除了 0 -> 3 -> 2 -> 4 之外,至少有一条路径可以到达 4,并且该路径应该比 0 -> 3 -> 2 -> 4 短,即与我们的假设相矛盾,即 0 -> 3 -> 2 -> 4 -> 5 是 0 和 5 之间的最短路径。那么在第三次迭代之后,2 和 4 应该连接起来。
第二,我们证明松弛应该是最短的。它不能越来越大,因为它是唯一的最短路径。
让我们看一个负循环图。
这是它的记忆表:
我们来证明,在|V|的迭代中,这里|V|是顶点数6,不应该停止更新。
我们假设更新停止(并且存在负循环)。让我们看看循环 3 -> 2 -> 4 -> 5 -> 3。
dist(2) <= dist(3) + w(3, 2)
dist(4) <= dist(2) + w(2, 4)
dist(5) <= dist(4) + w(4, 5)
dist(3) <= dist(5) + w(5, 3)
我们可以从上面的四个不等式中将左边和右边相加得到以下不等式:
dist(2) + dist(4) + dist(5) + dist(3) <= dist(3) + dist(2) + dist(4) + dist(5) + w(3, 2) + w(2, 4) + w(4, 5) + w(5, 3)
我们减去两边的距离,得到:
w(3, 2) + w(2, 4) + w(4, 5) + w(5, 3) >= 0,这与我们的说法相矛盾,即 3 -> 2 -> 4 -> 5 -> 3负循环。
所以我们确信在 |V| 的步骤以及在那一步之后更新永远不会停止。
我的代码位于 Gist。
参考: