johnson最短路径

来源:互联网 发布:java中的数组声明 编辑:程序博客网 时间:2024/06/05 07:11

Johnson算法是求稀疏图的多元最短路径的算法,权值可以为负,但是不可以有负环。Johson算法是Bellman-Ford算法, Reweighting(重赋权重)和Dijkstra算法的大综合。主要的思想是使用dijstra算法对每个结点求单源最短路,但是dijstra不能解决有负权值的边,所有需要给边重新赋值,且赋值后最短路径与原来的最短路径的距离和path相同。使用斐波那契堆作为优先级队列时时间复杂度是O(V^2logV + VE)。


Johnson算法具体步骤:

1.初始化,把一个node q添加到图G中,使node q 到图G每一个点的权值为0。

2.使用Bellman-Ford算法,从源点为q,寻找每一个点 v从q到v的最短路径h(v),如果存在负环的话,算法终止。

3.使用第2步骤中Bellman-Ford计算的最短路径值对原来的图进行reweight操作(重赋值):边<u,v>的权值w(u,v),修改成w(u,v)+h(u)-h(v)。

4.最后,移去q,针对新图(重赋值之后的图)使用Dijkstra算法计算从每一个点s到其余另外点的最短距离。

(5.使用dijstra计算完最短路后,需要d(i,j) = d'(i,j) + h(v) - h(u)才是最后结果)

伪代码(摘自算法导论):


阅读全文
0 0
原创粉丝点击