Dijkstra的算法:为什么我最终会陷入这个例子?

时间:2012-07-26 22:53:24

标签: graph theory

我一直试图跟踪Dijkstra的最短路径算法,以获得以下无向图:


        (B)
       /   \
      /     \
  6  /       \ 9
    /         \ 
   /           \
  /             \
 (A)- 5 -(C)- 1 -(F)----2----(I)
   \            /
    \          / 
  4  \        / 2
      \      /
       \    /
        \  /
         (D)

For clarification:
(N) will represent nodes, numbers with no formatting will represent weights.
the edge between A and C has a weight of 5, 
the edge between C and F has a weight of 1. 

我将在此概述我的流程:

由于A是我的初始节点,因此算法从这里开始。由于D是更便宜的路径,因此算法遍历到D.现在将A标记为已访问,这意味着我们无法再次遍历它。

在D处很容易看到我们将转移到F。

F是我开始遇到麻烦的地方。由于最短的路径将引导我到C,我被困在两个访问过的节点之间,无法到达我。任何人都可以帮助我吗?

编辑:抱歉图表的人,这个问题最初是从手机上询问的。我会尽快解决这个问题。

4 个答案:

答案 0 :(得分:5)

你的工作方式是错误的。 “在D处很容易看出我们将转向F”,这是不正确的。你首先访问D,然后访问C,而不是F.仔细查看算法及其作用。

首先你访问A所以你有以下成本:6到B,5到C,4到D和其余节点的INFINITE。

您首先转到D.您现在更新您的成本从A到F(通过D)到6.您要访问的下一个节点不是D,它是C,因为它具有最低成本< / strong>(5)所有未访问的节点。从A到F经过C的成本是6,这已经是您的成本,因此无需更新。

从那里你在B和F之间有一个6的关系。让我们说你先去B,然后没有任何事情发生,因为到F的最短路径已经是6,而通过B去F到15将花费15比你已经拥有的成本贵,所以不要更新成本。然后您访问F,因为它具有所有未访问节点的最低成本。从那里你更新你的路径,它不再是INFINITE而是8。

结果,从A到I的最短路径如下:A - D - F - I。

答案 1 :(得分:0)

从C你仍然无法返回A而你无法返回F所以这条路是假的。 如果它给你死胡同,你需要在下一次迭代中从图中删除C,或者忽略最后一步并按照你的预期从F移动到I.

答案 2 :(得分:0)

http://en.wikipedia.org/wiki/Dijkstra's_algorithm - 你记得它在移动到另一个顶点之前处理所有顶点的邻居,对吗? 在继续D之前,它处理C和B(计算它们的距离)。从你的图表来看,D和F之间没有路线。

答案 3 :(得分:0)

Dijkstra的算法使用优先级队列。它不是在图表上行走,并且可以按照不同于路径的顺序访问顶点。例如,这棵树:

A -> B -> C
  \
   > D -> E -> F

以A,B,D,C,E,F的顺序探索所有权重1。每次迭代都会以最小的成本访问顶点并弹出它;最初弹出A,B和D的成本更新为1;你访问B,C的成本更新为2;你访问D,E的成本更新为2;你访问E;最后是F。