算法导论 25.3 Johnson算法

本文介绍了Johnson算法,用于解决含有负权重边但无负权重环路的图中所有结点对之间的最短路径问题。通过新权重的定义确保最短路径不变且非负,经过Bellman-Ford算法初始化,再应用Dijkstra算法计算最短路径。算法的时间复杂度为O(V²lgV+VE)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,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 negative-weight cycle"

4. else for each vertex v∈G'.V

5.        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值