给出了一个有向图,其中每个边都有一个cost.Taking优点,即图中最多有两个负边,我的目标是求出从给定节点到V中所有节点的最短路径距离。算法的时间复杂度应该是O(|E| + |V|*log|V|),所以我认为需要应用Dijkstra算法。
我猜想我需要以某种方式将我给定的图转换成一个新的图,该图中从s到v的最短路径将等价于给定图中所需的最短路径。或者我需要修改Dijkstra的算法?
我现在很挣扎。任何帮助都将不胜感激!
发布于 2014-02-04 16:05:14
由于Dijkstra的算法是贪婪的,所以它不能处理负重。为此,您需要一些其他算法(如Bellman算法 )。
但是,如果您仍然想使用Dijkstra的算法,有一个已知的方法。在这种方法中,您需要重新分配成本,以便所有的成本都变为正的。
为此,您可以查看Johnson的算法。Johnson的算法包括以下步骤(取自维基百科):
发布于 2014-02-04 17:17:25
只是一些要开始的定义:
n1 = (n1s, n1e) (即从顶点n1s到顶点n1e)。
和n2 = (n2s, n2e)。s和e。的基本思想:
多次运行Dijkstra算法,以负重边的每个顶点和每个端点的顶点作为起点,以负重边的端顶点和每个起始顶点作为结束点,并利用这些值找到实际的最短路径。
算法:
因为Dijkstra的算法连续7次运行,
运行时间为O(7(|E| + |V| log |V|)) = O(|E| + |V| log |V|)。
https://stackoverflow.com/questions/21556978
复制相似问题