有向图之每一对顶点之间的最短路径

1 上一篇博客介绍了使用迪杰斯特拉算法求某个顶点到其他顶点的最短路径,这一篇介绍使用弗洛伊德(Floyd)算法求每一对顶点之间的最短路径,当然也可以使用迪杰斯特算法来求,求n次就行了。

2 弗洛伊德算法仍从图的带权邻接矩阵出发,其基本思想是:

2.1 假设求从顶点vi到vj的最短路径

2.2 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短的,尚需要进行n次试探。

2.3 首先考虑路径(vi,v0,vj)是否存在(即判断(vi,v0)和(v0,vj)是否存在),如果存在,则比较(vi,vj)和(vi,v0,vj)的路径长度取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。

2.4 假设在路径上再增加一个顶点v1,也就是说,如果(vi,....,v1)和(v1,..,vj)分别是当前找到的中间顶点的序号不大于0的路径,那么(vi,...,v1,...,vj)就有可能是从vi到vj的中间顶点的序号不大于1的最短路径。

2.5 将它和已经得到的从vi到vj中间顶点序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个顶点v2,继续进行试探。

2.6 以此类推,直到全部求出来。

3 解释

3.1 2.2步应该都明白,那么2.3步什么意思呢?假如vi到vj有直接路径,vi经过v0到vj也有路径,这条路径之可能有这三个顶点,因为v0前面不可能再有顶点了,v0在数组中存储的顺序最靠前,(vi,v0,vj)和(vi,vj)比较,结果肯定是中间顶点不大于0的最短路径。

3.2 2.4步呢?类似2.3步,vi到v1有路径,中间可能会经过v0顶点,v1到vj有路径

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值