一,Johnson算法的思想
如果图G中所有的边权重均为非负值,通过对每个结点进行一次Dijkstra算法来找到所有结点对之间的最短路径,如果图G中有负值的边但没有权重为负值的环路,就计算出一组新的非负权重值,并按同样的方法计算。
二,新权重的确定
我们定义新权重w'(u,v)=w(u,v)+h(u)-h(v),满足两个性质:一是对于所有结点对(u,v),路径p是使用原权重函数w时从结点u到v的一条最短路径,当且仅当p是在使用新权重函数w'时从u到v的一条最短路径,二是新权重为非负值。
三,Johnson算法介绍
准备阶段:一张赋值有向图
算法过程:我们在图G中增加一个新结点S,并让其与其他结点相连,形成一幅新图G',对G'进行Bellman-Ford算法计算从S到各结点的最短路径h,删除结点S,然后根据新权重确定公式:w'(u,v)=w(u,v)+h(u)-h(v)对原图的权重进行修改,使得权重都为正,然后对每个结点进行一次Dijkstra算法找到结点对的最短路径。
四,Johnson算法的伪代码
JOHNSON(G,w)
1. compute G',where G'.V=G.V∪{s},G'.E=G.E∪{(s,v):v∈G.V},w(s,v)=0 for all v∈G.V
2. if BELLMAN_FORD(G',w,s)==FALSE
3. print"the input graph contains a