哪种版本的Bellman-Ford算法正确,CLRS还是算法?

时间:2018-08-25 09:42:47

标签: algorithm graph bellman-ford

下面的代码来自算法入门,第三版

BELLMAN-FORD(G,w,s)
1 INITIALIZE-SINGLE-SOURCE(G,s)
2 for i = 1 to |G.V|-1
3   for each edge (u,v) ∈ G.E
4       RELAX(u,v,w)
5 for each edge (u,v) ∈ G.E
6    if v.d > u.d + w(u,v)
7       return FALSE
8 return TRUE

以下是算法,第4版

for (int pass = 0; pass < G.V(); pass++)
   for (int v = 0; v < G.V(); v++)
      for (DirectedEdge e : G.adj(v))
          relax(e);

似乎唯一的区别是通过次数。

for i = 1 to |G.V|-1

for (int pass = 0; pass < G.V(); pass++)

哪个是对的?

2 个答案:

答案 0 :(得分:1)

编辑:问题实际上是关于外循环的通过次数:N-1或N。Bellman的论文在下面链接,指出“动态编程的函数方程技术与近似值结合 在策略空间中,产生了一个迭代算法,该算法最多经过(N_1)次迭代即可收敛。” 在Lemma 24.2 and its proof中的CLRS中给出了理由。

原始答案:

for each edge (u,v) ∈ G.E

和:

for (int v = 0; v < G.V(); v++)
  for (DirectedEdge e : G.adj(v))
对于该算法,

是等效的:它们都在图形的每个边缘上迭代一次。第二个版本仅首先对所有顶点进行迭代,并且对于每个顶点,对其入射边缘进行迭代。

对于CLRS的第5-7行,他们检查是否没有负权重循环,但是在您从 Algorithms,第4版发布的摘录中显然忽略了这一点。正在检查Bellman's original paper,但我没有看到最后的检查,因此可能是CLRS或其他检查的补充。

答案 1 :(得分:0)

图中任意顶点的最短路径最多具有 | V | -1 条边,并且除了源以外,最多还具有 | V | -1 个顶点

第N 个边经过所有边后,保证沿任何最短路径到达的第N 个顶点分配了正确的成本,因此该算法只需要 | V | -1 表示所有最短路径。