Dijkstra算法失败的一个例子是一个负边缘

时间:2016-09-07 14:35:44

标签: algorithm computer-science dijkstra

我试图想一个所有边都有正权重的图,除了一条边以外,Dijkstra的算法无法产生正确的输出。

我很高兴有个主意。

修改
我已经把这个图看作反例,但我不明白为什么。 顶点A将是从队列弹出的最后一个,然后我们将Relax()A->E。因此,将选择路径S->A->E,这是正确的路径(而不是声称的S->B->E

enter image description here

由于

1 个答案:

答案 0 :(得分:2)

Dijkstra在扩展目标节点时终止。我们还在dijkstra(而不是队列)中使用优先级队列,以便我们扩展成本最低的节点。所以在你的例子中,A永远不会被扩展。

  open list = [ S cost:0 ] // priortiy queue
pop S out of open list
  closed list = [ S cost:0 ]
  open list = [ B cost:1 ; A cost:5 ]
pop B out of open list
  closed list = [ S cost:0 ; B cost:1 ]
  open list = [ E cost:2 ; A cost:5 ]
pop E out of open list
// it's better to terminate when we reach the goal but if we don't
// it doesn't make any difference we are going to find the shortest path
// to other nodes
   closed list = [ S cost:0 ; B cost:1 ; E cost:2 ]
   open list = [ A cost:5 ]
pop A out of open list
   // there isn't any nodes that we can push to open list
   closed list = [ S cost:0 ; B cost:1 ; E cost:2 ; A cost:5 ]
   open_list = []

Dijkstra在扩展它时将节点推送到其关闭列表,因为它假定它找到了最短的路径。因此,即使我们在达成目标时没有终止,我们也永远不会扩展A,因为它在我们的封闭列表中。