我有一个初始有向图G,我不时从中删除边(永远不要添加新的边)。我没有删除节点(尽管有些节点可能会断开连接)。 有没有办法有效地重新计算最短路径而不再从头开始运行Dijkstra?初始节点永远不会改变。
如果没有Dijkstra算法的增量版本,其他一些算法也没问题。但我不能使用A *(我记得有一个增量版本)因为我没有任何启发式知道我离目的地有多远。
谢谢
答案 0 :(得分:1)
您可以跟踪使用的边缘。如果删除一个,则可以使用它们查找需要更新的所有节点。
其他节点不需要更新。如果删除边缘,则只能使路径更长。
遍历所有边缘,如果源不需要更新,但目标确实将目标添加到Dijkstra优先级队列。 完成后,运行常规Dijkstra算法以计算新成本。
话虽如此,如果您从源中删除其中一个链接,您可能仍会运行整个dijkstra。因此,这可能只有在您不尝试删除已使用的链接时才有用(因为在那里很可能无法使用已删除的链接)或者如果您删除链接以便它远离源(这样你只需要更新几个节点)。