任意两点之间的最短路径问题(Floyd-Warshall算法)

求解所有两点之间的最短路问题叫做任意两点之间的最短路问题。Floyd-Warshall算法考虑的是
 一条最短路径上的中间结点。例如,简单路径p={v1,v2,...vl}上的中间结点指的是路径p上除了v1和 vl之外的任意节点,也就是处于集合{v2,v3,...vl-1}中的节点。
Floyd-Warshall算法基于以下: 
假定图G的所有顶点为V={1,2,3,...,n},考虑其中的一个子集{1,2,..,k},这里的K是小于n的整数。
对于任意的节点i,j属于V,从i到j的所有中间结点都取自于集合{1,2,3,...,k}的路径,并设p为其中权重最小的路径,也就是说路径p是简单路径。Floyd-Warshall算法利用了路径p和从i到j之间中间结点
取自集合{1,3,..,k-1}的最短路径之间的关系。该关系依赖于结点k是否是路径p上的一个中间节点。
    (1)如果结点k不是路径p上的中间结点,则路径p上的所有中间结点都属于集合{1,2,...,k-1}.所以,从结点i到结点j的中间结点取自于结合{1,2,...,k}的一条最短路径。
    (2)如果结点k是路径p上的中间结点,则路径p可以分解为i~k,k~j。
通过以上分析,可以得出以下结论:
记i到j的最短路径为d[i][j],那么具有以下递推公式:
d[i][j]= d[i][j]  最短路径不通过k
       = min(d[i][j],d[i][k]+d[k][j]) 最短路径通过k可以不断的使用同一个公式进行更新 
       min(d[i][j],d[i][k]+d[k][j]) 
以上算法使用DP策略,可以在O(|V|3)时间里求得所有两个结点之间的最短路径。
int d[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值