我三天前参加了奥林匹克考试。我遇到了一个很好的问题如下。
我们知道bellman-ford算法检查每个步骤中的所有边缘,如果是,则检查每个边缘
然后更新d(v)
,w(u,v)
是边(u, v)
的权重,d(u)
是顶点u
的最佳查找路径的长度。如果在一步中我们有no update for vertexes
,那么算法terminate
。假设这个算法,用于在s
迭代完成后找到图G中具有n
顶点的顶点k < n
的所有最短路径,以下哪项是正确的?
1)来自
s
的所有最短路径中的边数最多为k-1
2)来自
s
的所有最短路径的权重最多为k-1
3)图表没有负循环。
谁可以讨论这些选项?
答案 0 :(得分:8)
1是不正确的,因为如果我们碰巧以最短路径树的拓扑顺序放松弧,那么我们会在一次迭代中收敛,尽管最短路径树可能是任意深度的。
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.
如果我们同时进行放松(即,总是使用圆r中圆r-1的值,即使圆r已更新它们),那么1实际上是正确的,通过归纳(最短路径树的深度)从零开始,每轮最多只增加一次,而不是最后一轮。
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 :(得分:0)
我认为选项3是不正确的,因为要知道是否存在负权重周期,Bellman ford算法需要运行n次。 首先计算最短路径n-1次,然后再一次检查距离是否有任何改善,如果有改进,则表示负重周期为负。