我试图想一个所有边都有正权重的图,除了一条边以外,Dijkstra的算法无法产生正确的输出。
我很高兴有个主意。
修改
我已经把这个图看作反例,但我不明白为什么。
顶点A
将是从队列弹出的最后一个,然后我们将Relax()
边A->E
。因此,将选择路径S->A->E
,这是正确的路径(而不是声称的S->B->E
)
由于
答案 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,因为它在我们的封闭列表中。