如果我们可以在运行Bellman Ford算法后再次放松边缘,那么为什么存在负循环

时间:2014-06-25 18:50:26

标签: algorithm bellman-ford

我们知道Bellman Ford是一种找到负循环的算法。 以下是Bellman Ford的算法 输入:给定图G(V,E)和w(e)是权重 输出:如果存在负循环,则返回Yes。

1: set d(s) = 0 and d(v) = 1 for all v (- s
2: for i = 1 ... n-1 do
3:      for every edge (u, v) in G do
4:        if d(v) > d(u) + w(u,v) then
5:           d(v) = d(u) + w(u,v)
6:      end for
7: end for
8: for every edge (u, v) in G do
9:     if d(v) > d(u) + w(u, v) then
10:       return True
11:return False

第8行 - 第11行是做一次放松以检测负循环,但为什么这些行保证检测到负循环,如果图中有一个?

1 个答案:

答案 0 :(得分:0)

您正在检测这样一个事实:某些顶点之间的最短路径太长,以至于它必须多次访问某个顶点,因此它包含一个循环。如果该周期的长度> = 0,那么移除它将最多保持路径的长度相同,因此不会发现它是一种改进。因此,如果您发现其中有一个循环的最短路径,则循环必须为负长度。此外,如果存在负长度的循环,则会发现它是从其中任何顶点返回到同一顶点的最短路径。