【问题标题】:Incremental Dijkstra or shortest path algorithm?增量 Dijkstra 或最短路径算法?
【发布时间】:2016-01-11 23:33:48
【问题描述】:

我有一个初始的有向图 G,我不时从中删除边(从不添加新边)。我不会删除节点(尽管有些节点可能最终会断开连接)。 有没有一种方法可以有效地重新计算最短路径而无需再次从头开始运行 Dijkstra?初始节点永远不会改变。

如果没有 Dijkstra 算法的增量版本,其他算法也可以。但我不能使用 A*(我记得有一个增量版本),因为我没有任何启发式方法来知道我离目的地有多远。

谢谢

【问题讨论】:

    标签: algorithm graph-algorithm dijkstra shortest-path


    【解决方案1】:

    您可以跟踪使用的边缘。如果您删除一个,那么您可以使用它们来查找所有需要更新的节点。

    其余节点无需更新。如果删除边缘,则只能使路径更长。

    遍历所有边缘,如果源不需要更新但目标确实将目标添加到 Dijkstra 优先级队列。 完成后,运行常规 Dijkstra 算法来计算新成本。

    话虽如此,如果您从源中删除其中一个链接,您可能仍会运行整个 dijkstra。因此,这可能仅在您不尝试删除使用过的链接时才有用(因为很有可能删除的链接无论如何都不会被使用)或者如果您删除链接以使其远离源(这样您只需要更新几个节点)。

    【讨论】:

    • 我想我知道你的意思,但是如果我一次删除两条边怎么办(这可能发生)?这意味着我需要将这些边的头节点放入堆栈中,但是按照一定的顺序,不是吗?首先是离源较远的那个,然后是离源较近的那个?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多