Dijkstra算法总是提供最短路径吗?

时间:2014-03-25 05:13:22

标签: graph dijkstra

我正在学习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的算法显然没有在这里显示正确的结果。

4 个答案:

答案 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步。

  1. 第一步是用暂定距离3标记D,用暂定距离4标记E.
  2. 下一步将选择D,因为它是具有最低暂定距离的非访问节点
  3. 然后你会用距离标记来自D的所有非访问节点(标记B与暂定距离19(3 + 16))
  4. 然后选择具有最低暂定距离的下一个非访问节点。这将选择E(4)
  5. 用他们的暂定距离标记所有E节点。 C被标记为6(4 + 2)。
  6. 然后选择具有最低暂定距离的下一个非访问节点。这将选择C(6)
  7. 用他们的暂定距离标记C的所有节点。 A被标记为9(6 + 3)。
  8. 当你到达距离为9的A时停止。

答案 3 :(得分:0)

我怀疑您是否真的了解该算法。看一下这个:https://www.youtube.com/watch?v=XB4MIexjvY0

然后从顶点A开始实施。

Dijkstras算法仅在边缘为非负值时才找到从任何给定节点到所有其他节点的最短路径。