【问题标题】:An example of Dijkstra's algorithm to fail with one negative edgeDijkstra 算法因一个负边缘而失败的示例
【发布时间】:2016-09-07 14:35:43
【问题描述】:

我正在尝试考虑一个图,它的所有边都具有正权重,但一条边除外,这样 Dijkstra 的算法无法产生正确的输出。

我很高兴有一个想法。

编辑:
我将此图视为反例,但我不明白为什么。 顶点A 将是最后一个从队列中弹出的,然后我们将Relax() 边缘A->E。因此将选择路径S->A->E,这是正确的路径(而不是声称的S->B->E

谢谢

【问题讨论】:

    标签: algorithm computer-science dijkstra


    【解决方案1】:

    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,因为它在我们的封闭列表中。

    【讨论】:

    • “目标节点”是什么意思?我知道 Dijkstra 的算法在优先级队列为空时终止。
    • 我很快就会在我的回答中解释它。
    • CLRS 书另有说明。我们将一个顶点添加到封闭集合中,前提是它离开了优先级队列。
    • "CLRS 书说不然。我们将一个顶点添加到封闭集合中,如果它离开优先级队列" 这正是我所说的,扩展意味着从 p 队列中弹出一个节点并在开放列表中添加\更新其邻居。
    • 好吧,但无论如何 - 如果您同意顶点 A 会在某个时候弹出,那么您应该意识到 A->E 边缘将“松弛”,因此,@987654324将选择@路径。
    猜你喜欢
    • 2021-12-27
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2011-04-19
    • 2016-05-07
    • 2020-06-28
    相关资源
    最近更新 更多