我对此有一个跟进问题: Finding shortest path distances in a graph containing at most two negative edges
Ranveer的解决方案看起来很棒,但速度不够快,因为我需要O(| E | + | V | * log | V |)快速算法。
我猜Dukeling的解决方案效果很好。它有意义,它在Dijkstra算法的相同运行时间内运行。
但是,我的目标是找到从给定节点到V中所有节点的最短路径距离。 如果我通过将V中的所有节点设置为终点e来应用Dukeling的算法,我将需要运行它| V | - 1次。然后,运行时间为O(| V || E | + | V ^ 2 | * log | V |)。
任何帮助将不胜感激!
答案 0 :(得分:3)
Dijkstra的算法以其原始形式查找从源节点到图中所有其他节点的所有最短路径。
您(至少)有两个选项可以解决您的问题:
使用Bellman - Ford。它并不像它的大哦那么慢,至少不一定。确保您像BF search一样使用FIFO queue来实现它。这意味着每次更新到达队列的距离时,您都会将节点插入队列,并且只有当节点不在队列中时才会插入。其他优化也是可能的,但这应该已经在实践中为您提供了快速算法;
使用Dijkstra's,但修改类似于Bellman - Ford:默认Dijkstra永远不会在优先级队列中插入两次节点。如果已更新节点的距离,请确保重新插入节点。这将处理负成本边缘。它本质上使算法更接近Bellman - 上面描述的福特,但使用优先级队列而不是FIFO队列。这也可以让您更接近您期望的复杂性。