我们知道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行是做一次放松以检测负循环,但为什么这些行保证检测到负循环,如果图中有一个?
答案 0 :(得分:0)
您正在检测这样一个事实:某些顶点之间的最短路径太长,以至于它必须多次访问某个顶点,因此它包含一个循环。如果该周期的长度> = 0,那么移除它将最多保持路径的长度相同,因此不会发现它是一种改进。因此,如果您发现其中有一个循环的最短路径,则循环必须为负长度。此外,如果存在负长度的循环,则会发现它是从其中任何顶点返回到同一顶点的最短路径。