我正在学习Dijkstra的算法并且有一个基本的查询。我的图表如下所示..(非负节点):
A --- 2 ----- ------乙------ 16 ----- d 3 -------˚F
* *
* *
3 4
* *
C ---------- 2 --------------------------- E
从上图显示不清楚,但AC的距离为3,EF的距离为4。
我有兴趣找到A和F之间的最短路径。
考虑目标节点F.当我们考虑其最近的节点时,我们得到D(DF具有权重3和EF 4)。然而,当我们遵循该路径时,我们得到最短的路径:A,B,D,F(总距离:19)。
快速观察告诉我们,最短路径实际上是A,C,E,F(距离:9)。但是,由于在第1步中,E比D更远,我们遵循D。
我在这里遗漏了什么吗? Dijkstra的算法显然没有在这里显示正确的结果。
答案 0 :(得分:1)
是的,当边缘成本都是正数时,Dijkstra总是提供最短路径。但是,当存在负边缘成本时,它可能会失败。
答案 1 :(得分:1)
该算法适用于您的图表。它必须是您实施中的错误。
Visit A
-Set B distance = 0 + 2 = 2, previous = A
-Set C distance = 0 + 3 = 3, previous = A
Visit B
-Set D distance = 2 + 16 = 18, previous = B
Visit C
-Set E distance = 3 + 2 = 5, previous = C
Visit E
-Set F distance = 5 + 4 = 9, previous = E
Visit F
-Set D distance = 9 + 3 = 12, previous = F // you can early-out here if you want
Visit D
-Alternate distance to F: 18 + 3 = 21 (fail since current distance, 9, is smaller)
Shortest path = F.previous = E, E.previous = C, C.previous = A
= A, C, E, F
答案 2 :(得分:0)
是的,你错过了一些东西。看看下面的第4步。
当你到达距离为9的A时停止。
答案 3 :(得分:0)
我怀疑您是否真的了解该算法。看一下这个:https://www.youtube.com/watch?v=XB4MIexjvY0
然后从顶点A开始实施。
Dijkstras算法仅在边缘为非负值时才找到从任何给定节点到所有其他节点的最短路径。