的Bellman-Ford算法确定从源的最短路径到所有其它顶点。最初,与所有其他顶点之间距离设置为。然后计算从到每个顶点的最短路径;这正好为 迭代。我的问题是:小号∞ 小号| V | − 1
- 为什么需要迭代?
- 如果以其他顺序检查边缘会不会很重要?
假设,如果我先检查边缘1,2,3,然后在第二次迭代中检查2,3,1。
麻省理工学院的埃里克教授说顺序并不重要,但是这使我感到困惑:如果算法的值取决于边缘但是是在之后更新的,该算法是否会错误地基于边缘更新节点?
的Bellman-Ford算法确定从源的最短路径到所有其它顶点。最初,与所有其他顶点之间距离设置为。然后计算从到每个顶点的最短路径;这正好为 迭代。我的问题是:小号∞ 小号| V | − 1
麻省理工学院的埃里克教授说顺序并不重要,但是这使我感到困惑:如果算法的值取决于边缘但是是在之后更新的,该算法是否会错误地基于边缘更新节点?
Answers:
考虑从到的最短路径,。该路径最多包含边,因为如果我们没有负的权重循环,则在最短路径中重复顶点始终是个坏主意(或者至少存在一条不重复顶点的最短路径)。 。
在第一回合中,我们知道边缘将被放宽,因此在此回合之后的距离估计将是正确的。请注意,目前我们知道是什么,但是在放松所有边缘的同时,我们也必须放松该边缘。在第二轮中,我们在某个时候放松。我们仍然不知道或是什么,但是我们知道它们的距离估计是正确的。
重复此,一些轮后,我们已放宽,在这之后的距离估计为是正确的。在整个算法结束之前,我们不知道是多少,但是我们知道它会在某个时刻发生(假设没有负权重循环)。
因此,关键的观察结果是,在第轮之后,最短路径的第个节点必须将其距离估算值设置为正确的值。由于路径最多为边长,因此舍入即可找到此最短路径。如果第三轮仍然改变了一些东西,然后又发生了一些奇怪的事情:所有路径都应该已经“结算”到它们的最终值,所以我们必须面临一个负负周期的情况。
没有任何循环的最长路径为|V|
。我们从源开始,所以我们已经有一个长度为1的路径,因此我们需要|V| - 1
更多的节点才能获得最长的路径。
顺序无关紧要,因为每个顺序都将保持不变:n
迭代之后,每个节点的值小于或等于从s
到包含最多n
边的节点的最小成本路径的成本。
如果在迭代开始时,成本直到n
节点都是正确的,那么在迭代结束时,成本到节点都是正确的n+1
。重新排序可能会导致某些节点在正常进行更新之前具有较低的成本,但是无论如何最终还是会对其进行更新。