弗洛伊德算法(求每一对顶点间的最短路径)

每一对顶点间的最短路径

求解每一对顶点间的最短路径有两种方法:其一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法;其二是采用下面介绍的弗洛伊德算法。这两种算法的时间复杂度均为O(n^3),但后者形式上较简单。

仍然使用带权的邻接矩阵arcs来表示有向网G,求从顶点vi到vj的最短路径。算法的实现要引入以下辅助的数据结构。
(1)二维数组Path[i][j]:最短路径上顶点vj的前一顶点的序号。
(2)一维数组D[i][j]:记录顶点vi和vj之间的最短路径长度。

弗洛伊德算法[算法步骤]
将vi到vj的最短路径长度初始化,即D[i][j]= Garss[i][j],然后进行n次比较和更新。
①在vi和vj间加入顶点v0,比较(vi,vj)和(vi,v0,vj)的路径长度,取其中较短者作为vi到vj的中间顶点序号不大于0的最短路径。
②在vi和vj间加入顶点v1,得到(vi,…,v1)和(v1,…,vj),其中(vi,…,v1)是vi到v1的且中间顶点的序号不大于0的最短路径,(v1,…,vj)是v1到vj的且中间顶点的序号不大于0的最短路径,这两条路径已在上一步中求出。比较(vi,…,v1,…,vj)与上一步求出的vi到vj的中间顶点序号不大于0的最短路径,取其中较短者作为vi到vj的中间顶点序不大于1的最短路径。
③依次类推,在vi和vj间加人顶点vk,若(vi,…,vk)和(vk,…,vj)分别是从vi到vk和从vk到vj的中间顶点的序号不大于 k-1的最短路径, 则将(vi,…,vk,…,vj)和已经得到的从vi到vj且中间顶点序号不大于k-1的最短路径相比较,其长度较短者便是从vi到vj的中间顶点的序号不大于k的最短路径。这样,经过n次比较后,最后求得的必是从vi到vj的最短路径。按此方法,可以同时求得各对顶点间的最短路径。

根据上述求解过程,图中的所有顶点对vi到vj间的最短路径长度对应一个n阶方阵D。在上述n+1步中,D的值不断变化,对应一个n阶方阵序列。
n阶方阵序列可定义为:
D^(-1) D^(0), D^(1), ……D^(k), ……D^(n-1)
其中:
D^(-1)[i][j] = G.arcs[i][j];
D^(k)[i][j] = Min{D(k-1)[i][j],D(k-1)[i][k]+D^(k-1)[k][j]}

显然, D^(-1)[i][j] 是从vi到vj的中间顶点的序号不大于1的最短路径的长度; D^(k)[i][j] 是从vi到vj的中间顶点的序号不大于k的最短路径的长度; D^(-1)[i][j] 就是从vi到vj的最短路径的长度。

[算法描述]

void ShortestPath,_Floyd (AMGraph G)
{
   
   
     
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值