前言
关于Floyd算法的手工快速求解,对考研数据结构大大滴有好处,如果感觉有用的话点个赞吧。
一、题目
利用Floyd算法求下图任意两顶点间的最短路径(图片来自天勤2021年数据结构高分笔记)
二、步骤
1.把图转成邻接矩阵形式
这一步相信各位大帅比都会。很简单,看图发现有4个点,画出4×4的空表,观察图又发现0到1有条,边权值为5,那么第0行第1列这个单元填入5,其他边同理。最后把剩下没有填完的单元全部写无穷(为了方便这里用X代替),表示该单元对应的两点之间无路径。得到邻接矩阵如下:
初始时,两点最短路径中间顶点矩阵path如下(起初没有中间顶点,用-1表示):
2.画十字
相信各位都知道Floyd算法的核心思想就是找中间点来缩短两点之间的距离。若以第i个点作为中间点,则在邻接矩阵的(i,i)单元画十字,下面以0作为中间点开始:
3.排除
首先,画十字的部分(黄色)不要修改。其次,因为对角线部分全0,所以这部分一定不需要修改。最后,看十字(黄色)部分,找到有X(无穷)的单元,在上面继续画十字。至于为什么这么做,别问,找一个题来照着做。
以被选中的X为中心画十字排除,完毕后结果如下(橙色为被排除部分):
4.比较
剩下的每个绿色单元都有横竖对应的两个黄色单元,如下图黑色框起部分:
计算两个黄色单元的和,若该和小于绿色单元的值,则用该和替换绿色单元的值,否则不做改变。
上图由发现3+5>3;3+7>2;两个单元均不改变。
5.得出一轮结果
由上面的分析可知,以0作为中间点没有缩短任何距离
6.将剩余其他顶点重复2-5操作
在顶点0处理结果的基础上继续操作剩下的1、2、3顶点
顶点1作为中间点
(1)画十字
(2)排除
(3)比较
观察上一个图绿色单元X、7、2,绿X对应黄色单元5和4,绿7对应黄色单元5和2,绿2对应黄色单元3和2,发现5+4<X;5+2=7;3+2>2;所以只改变第一行第三个单元,该单元的值变为对应的两个黄色单元值之和,即5+4=9,结果如下
值改变后path矩阵的相应位置也要修改成中间顶点的编号,因为本次取中间顶点为1,所以修改如下:
顶点2作为中间点
(1)画十字
(2)排除
(3)比较
观察发现三个值为X的绿色单元满足修改条件,把它们的值分别修改为对应的两个黄色单元之和
值改变后path矩阵的相应位置也要修改成中间顶点的编号
顶点3作为中间点
(1)画十字
(2)排除
(3)比较
值改变后path矩阵的相应位置也要修改成中间顶点的编号
7.最终结果
当所有顶点都完成后即可得到最终结果
任意两点最短路径为
两点最短路径中间顶点矩阵path为
结语
王道、天勤给的方法都是检查所有顶点对,一一进行比较,个人感觉不够快。此方法重要在于画十字,等你熟练之后,十字一画,要改哪个地方,值是多少,一目了然。根本不需要检查所有顶点对,分分钟写出结果。