【问题标题】:Why no relaxing of all edges in the first iteration of Bellman Ford Algorithm?为什么在贝尔曼福特算法的第一次迭代中没有放松所有边缘?
【发布时间】:2011-11-21 16:34:32
【问题描述】:

贝尔曼福特算法请参考下页(显示了一个例子)。 http://compprog.wordpress.com/2007/11/29/one-source-shortest-path-the-bellman-ford-algorithm

我还是不明白。在外循环的第一次循环迭代中,我们举例来说,你首先修改边1->2和边1->4,放松边2->3,2->5,4-有什么问题>3, 4->5,在同一步骤中,因为我们有 d[2] 和 d[4]。

【问题讨论】:

  • 没有问题。您可以这样做,实际上您链接的代码可以做到这一点(或者可以,取决于边缘在输入文件中出现的顺序)。您刚刚选择了一个特定的顺序来放松边缘,从而产生愉快的结果。在链接的帖子中,每次都通过松弛步骤检查所有边,并且随着每条边的松弛而更新距离,因此对于特定图,可以想象在第一次松弛迭代结束时所有边都将完全松弛。跨度>

标签: algorithm graph-algorithm bellman-ford


【解决方案1】:

如果您使用稍微不同的 Bellman-Ford 版本,这个问题就会神奇地消失:

set toRelax = {initial_vertex}
while toRelax is not empty:
    u = remove a vertex from toRelax
    for each neighbour v of u:
       if we can relax u-v:
          relax u-v
          add v to toRelax

注意现在每个“步骤”如何涉及单个顶点!是否在“同一步骤”中完成的事情只是您使用的特定实现的产物,最终并不会真正改变算法。

【讨论】:

  • 我真的很喜欢这个版本。您只是试图放松有机会改变当前状态的边缘。文献中有关于这种方法的内容吗?真的还是B-F吗?这似乎是一个迭代的 Dijkstra,而不是一步优化一个顶点,您只需在该步骤中尽可能好地得到它,同时保留将来重新访问它的权利。
  • 但这种方法似乎失去了检测负循环的能力。 stackoverflow.com/questions/29817131/…
猜你喜欢
  • 2022-08-13
  • 2021-07-30
  • 2021-03-17
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多