【问题标题】:Bellman Ford and One Olympiad Questions?贝尔曼福特和一个奥林匹克问题?
【发布时间】:2015-04-08 16:42:20
【问题描述】:

三天前我参加了奥林匹克考试。我遇到了一个很好的问题如下。

我们知道 bellman-ford 算法在每一步中检查所有边,并且对于每条边如果,

d(v)>d(u)+w(u,v)

然后更新d(v),使得w(u,v) 是边(u, v) 的权重,d(u) 是顶点u 的最佳查找路径的长度。如果一步我们有no update for vertexes,算法terminates。假设该算法在完成k < n迭代后,从图G中的顶点sn顶点找到所有最短路径,以下哪项是正确的?

  1. s 开始的所有最短路径中的边数最多为k-1
  1. 来自s的所有最短路径的权重最多为k-1
  1. 图表没有负循环。

谁能讨论这些选项?

【问题讨论】:

    标签: algorithm data-structures graph graph-theory shortest-path


    【解决方案1】:

    1 不正确。首先,如果有的话,我们总是会找到具有 k 条边的最短路径。而且,如果我们碰巧按照最短路径树的拓扑顺序松弛弧,那么我们会在一次迭代中收敛,尽管最短路径树可能是任意深度的。

    s --> t --> u --> v
    
    Relax s->t, t->u, u->v; shortest path from s->v is three hops,
    but B--F has made two iterations.
    

    2 不正确,因为谁知道权重是多少?

      100
    s --> t
    
    Relax s->t; weight is 100, but B--F has made two iterations.
    

    3 是正确的,因为通过平均参数,负循环的至少一个弧将是不松弛的。让v1, ..., vn 成为一个循环。由于弧是放松的,我们有d(vi) + len(vi->vi+1) - d(vi+1) >= 0。将所有 i 的不等式相加,然后将 d 项简化为 sum_i len(vi->vi+1) >= 0,这表示循环是非负的。

    【讨论】:

    • 非常非常好的答案。请您添加更多详细信息。请学习我。一个例子或更多细节。我嫉妒。请为我浪费您宝贵的时间。
    • 第(1)部分确实如此。这个想法是,在 k 个步骤中,算法只考虑长度为 k 的路径。事实上,你可以通过对 k 的归纳来证明,在 k 步之后实现 d(v) 值的路径最多有 k 条边长。
    • 但是,如果同时评估所有边?第一个又错了?棘手的问题...
    • @MK 这里有两个不同的问题。 p。 295,贝尔曼的未优化版本——福特是我所指的“同时放松”版本。提前终止是一种不同的优化——因为每一轮贝尔曼——福特都做同样的操作,如果我们对整轮不做任何改变(对于同步或非同步版本,没关系),那么显然所有后续回合也不会改变,所以我们可以停下来。
    • @MK 是的,更准确地说,贝尔曼找到的每条最短路径——福特的长度最多为 k,其中 k 是完成的回合数。
    【解决方案2】:

    我认为选项 3 不正确,因为要知道是否存在负权重循环,贝尔曼福特算法需要运行 n 次。 首先n-1次计算最短路径,然后再检查一次距离是否有任何改善,如果有改善,则表示存在负权重循环。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多