Graph Dijkstra算法总是给出最短路径吗?

Graph Dijkstra算法总是给出最短路径吗?,graph,dijkstra,Graph,Dijkstra,我正在学习Dijkstra的算法,有一个基本的查询。我有一个图,如下所示..非负节点: A--2--B--16--D--3--F * * * * 3 4 * * C---2----E 上图显示不清楚,但A

我正在学习Dijkstra的算法,有一个基本的查询。我有一个图,如下所示..非负节点:

A--2--B--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。然而,因为在第一步中,E比D远,所以我们跟随D


我是不是遗漏了什么?Dijkstra的算法显然没有给出正确的结果。

是的,当边缘成本都为正时,Dijkstra的算法总是给出最短路径。但是,当存在负面边缘成本时,它可能会失败。

是的,您缺少了一些东西。请看下面的步骤4

第一步是用暂定距离3标记D,用暂定距离4标记E。 下一步将选择D,因为它是具有最小暂定距离的未访问节点 然后用距离标记D中所有未访问的节点,用暂定距离19 3+16标记B 然后选择下一个具有最小暂定距离的未访问节点。这将选择e4 标记E的所有节点及其暂定距离。C被标记为64+2。 然后选择下一个具有最小暂定距离的未访问节点。这将选择c6 用它们的暂定距离标记C的所有节点。A被标记为9 6+3。
当到达距离为9的A时停止。

该算法与图形配合得很好。这一定是您的实现中的一个bug

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

我怀疑你是否真的理解这个算法。看看这个:

然后从顶点A开始实现它


Dijkstras算法只在边不为负的情况下,才能找到从任何给定节点到所有其他节点的最短路径

是的,您缺少了一些东西,算法总是选择累积距离最小的节点作为下一个要探索的节点。我们不会将目标节点标记为已访问,直到它是最小的未访问距离。