贝尔曼福特和一个奥林匹克问题?
Posted
技术标签:
【中文标题】贝尔曼福特和一个奥林匹克问题?【英文标题】: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中的顶点s
与n
顶点找到所有最短路径,以下哪项是正确的?
从
s
开始的所有最短路径中的边数最多为k-1
来自
s
的所有最短路径的权重最多为k-1
图表没有负循环。
谁能讨论这些选项?
【问题讨论】:
【参考方案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次计算最短路径,然后再检查一次距离是否有任何改善,如果有改善,则表示存在负权重循环。
【讨论】:
以上是关于贝尔曼福特和一个奥林匹克问题?的主要内容,如果未能解决你的问题,请参考以下文章