Floyd算法求图最短路径及实现

本文介绍了Floyd算法的基本思想和实现过程,通过比较直接路径与间接路径的长度寻找图中任意两点的最短路径。算法正确性通过记录前驱节点的二维矩阵roadMap得到保证,从而能求出连通图中任意两点的最短路径。
摘要由CSDN通过智能技术生成

最短路径搜索是基于Floyd算法的改进。

Floyd算法的基本思想

这里写图片描述
图1 选i到j的最短路径
Floyd算法的基本思想是:比较直接从i到j和从i经k到j的路径长度,选择较短的一条。当此条最短路径选定后,无论是i->j,或者是i->k->j都可以抽象成i->j,既都是以i为起点,j为终点的一条最短路径。
此时,考虑i,j,k,之外的另一节点n,要找i到n的最短路径。
这里写图片描述
图2
重复上述比较,我们显然可以找到一条i到n的最短路径。
继续添加节点,我们显然可以任意找到一张连通图中,任意两点的最短路径。

求路径原理及正确性

这里写图片描述
图3 从终点往回找最短路径直到终点
考虑如图3的一条最短路径。要想描述这条最短路径,我们只需要知道,每一个node的前驱节点是什么,从终点一直往回追寻,直到找到起点,输出路径。
于是,我们可以用一个二维矩阵roadMap来记录前驱节点。roadMap[i][j]是从起点i到终点j的最短路径中j的前驱节点。roadMap[i][j] == k 则说明,此条路径中j的前驱节点为k,从而转化为找i到k的最短路径,而roadMap[i][k]又是i到k最短路径中k的前驱节点。依次类推,一直往回找,知道roadMap[i][i]==i,便回溯到了起点i.
问题就转化为了求这样的roadMap矩阵。
因为Floyd算法是可以求出一张连通图的任意两个节点的最短路径长度,我们在每次比较时都记录,显然也可以求出任意两个节点最短路径的前驱节点。例如,如果是i->j更短,则j前驱节点为i。若i->k->j,更短,则j前驱节点为k.


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值