在“算法简介,第3版”练习24.3-5中想要一个例子,这是错误的(并非总是如此)。那可能吗?在我看来,这是不可能的,因为在已经确定当前顶点的路径时,每个边都是放松的。
一字不漏:
N教授声称Dijkstra算法的正确性证明。他声称Dijkstra算法按照它们在路径上出现的顺序放宽图中每条最短路径的边缘,因此路径松弛属性适用于从源可到达的每个顶点。通过构建一个有向图来表明教授是错误的,Dijkstra的算法可以放松最短路径的边缘。
答案 0 :(得分:10)
考虑以下有向图:(A,B),(A,C),(B,D),(C,D),(D,E)边权重w(A,B)= 1, w(A,C)= 1,w(B,D)= 0,w(C,D)= 0,w(D,E)= 1.源顶点是A.在边缘放松的边缘的可能排列Dijkstra算法是(A,B),(A,C),(B,D),(D,E),(C,D)。此外,在执行Dijkstra算法后,A.d = 0,B.d = 1,C.d = 1,D.d = 1,E.d = 2。从A到E有两条最短的路径,一条是ABDE,另一条是ACDE。矛盾是第二条路径,边缘(C,D)应始终在(D,E)之前放松。
答案 1 :(得分:2)
关键在于结论不是来自前提,而是构建一个反例。 SSSP找到所有最短路径。没有理由要求严格按顺序找到最短路径。考虑一个树形图。所有路径也最短。现在,如果我们放松根,那么边缘就没有特定的排序。但假设你甚至强加了一个。然后放松最近的非根节点后,第二层可能会有一堆非常长的边缘。下一个最近的根邻居可能有一堆非常短的出站边缘到第二层的那一部分。在这种情况下,你将放松与你已经放松的其他边缘相比总长度更短的边缘,因为你总是以最短路径顺序放松 NODES,而不是边缘。
答案 2 :(得分:2)
我认为措辞中的关键词是dijkstra的算法“放宽了图中每条最短路径的边缘......”
如果存在多个相同成本的最短路径,那么这就是谎言。
考虑这张图: A - > B,A - > C,B - > D,C - > D.源是A,目的地是D.每个边缘权重是1.从A到D有两条路径,一条到B条,一条到C条。但是一条边B-> D或C-> D从不放松
仍然没有说服,因为dijkstra在评估D的另一边之前终止了?折腾额外边缘D-> E并将目的地设置为E.从A-> D到B的路径与A-> D到C的成本相同,并且它们都比A-的成本便宜&GT,E。但是你永远不会将第二条边放宽到D,因为算法只会将边放松到它不知道最短路径的顶点。
答案 3 :(得分:2)
考虑图表:
A--->B A--->C B--->C C--->D
让每一条边都有重量0。
Dijkstra的算法可以按顺序放松边缘
(A,C) (A,B) (C,D) (B,C)
图表有两条从A到D的最短路径,都是0。
A-->B-->C-->D or A-->C-->D
最短路径{A→B→C→D}的边缘无序地松弛,因为(B,C)在AFTER(C,D)之后松弛。
答案 4 :(得分:0)
生成到达目的地的单边,重量为3。现在添加一个包含多个停靠点的路径,总重量小于3,也到达目的地。放松原点时,您将目标节点的颜色设置为三,这是错误的。您必须继续放宽所有节点(距离目标的最小路径),直到该集合为空。只有这样你才能确定D的算法能给你正确答案。
查找A *算法以获得更多乐趣。