Floyd算法寻找最佳居住点

6 篇文章 0 订阅
1 篇文章 0 订阅

我们知道,Floyd算法结合邻接矩阵的方式,能帮我们找出一张图中所有顶点的最短路。那么具体是怎么实现的,先来看一个例子:

假设ABC是三个城市,如果你想挑一个城市在里面买房子,且想在自己住的房子离附近的城市尽可能近,你会选择ABC哪一个城市购买房子?

很容易看出,对于C城市,C城市到B城市要走400m,到A城市要走600m。而对于A城市,A到B 400m,A到C 600m。最后到B城市,B到A和B到C都是400m,所以显而易见选择B城市最符合。

在上面这张图中,顶点比较少,可能你会一眼就找到符合心意的城市。那么如果顶点有很多呢?比如在一座城市里有许多房地产,房地产之间又有许多线路入地铁,公交。那么你光靠眼镜是很难找出最佳居住点的。比如下面的地铁线路图:

解决这样的问题,可以联系到“图”的问题,图中的顶点、边和边上的权值构成的网络,就像上面的地铁线路图一样。

首先我们可以构建一张图,例如这样:

6个顶点11条边构成的无向网图。这样的图我们就很难一眼看出哪个“居住点”是综合离其他城市更近的。所以我们可以选择先把图中每一个顶点到其他顶点的最短路径找出来。这就可以用到Floyd算法,调用完Floyd算法后得到一个矩阵。

经过Floyd算法后得到的矩阵(下面用arr[ ][ ]表示)中,arr[ i ][ j ]存的元素表示顶点“i”到顶点“j”之间的最短路径。例如上图中(居住点从1开始编号)第5行第4列元素为50,也就是说顶点5到4的最短路径为50。

那么回到要解决的问题,怎么找出最佳的居住点?可以联系到求算法复杂度的问题,我们找出每个顶点到其他顶点的最短路径中的最大值(也就是等于“最坏的情况”)。例如矩阵中第一行的最大值是81,说明顶点1到其他顶点的最长路径是81,矩阵中第二行最大值是80,说明顶点2到其他顶点的最长路径是80。以此类推,找出所有顶点到其他顶点的最短路径中的最大值,分别是81、80、120、70、120、80。然后在这些最大值(最坏的情况)中找出最小值,最小值是70,是矩阵中的第4行第3列的元素,也就是说居住点4到其他顶点的最长距离是70,这是所有居住点离最坏情况中最好的一个了。所以选择居住点4是最佳的。

那么有了思路之后,看看代码要怎么写?

首先来看怎么实现找最佳居住点函数(我们设为FindResidence)

把建立好的图传进去后,首先调用Floyd算法求得每一个居住点到另一个居住点的最短路径的矩阵D。然后从矩阵D中每一个居住点的最短距离的最大值中寻找最小值,以及找出这个居住点的编号。找出所有居住点的最短距离的最大值中的最小值(第162行开始),可以用顺序查找的方法,先定义一个变量MinDist让它等于最大值INFINITY(也就是65535),然后一个for循环i从0开始和矩阵中的每一个居住点的最短路径最大值比较。第170行如果找到一个更小的MaxDist,就更新MinDist。这里还有一个函数就是要找某个居住点最短路径中的最大值,也就是函数FinMaxDist(第164行)

找最大值函数可以这样写,传进去最短路径的矩阵D,第i行元素i(也就是第i号居住点的编号,也可以说是行号),和顶点个数numv(因为要扫描每一个顶点嘛)。先定义一个变量MaxDist让它等于0,然后找到一个更大的就更新一下这个最大值。第189行开始for循环找D[ i ][ k ],也就是扫描第i个居住点,第i行的所有最短路径中,找出最大值,注意k不可以等于i,因为矩阵中的对角线我们都初始化为了最大值,所以如果扫描对角线的元素的话MaxDist就一定会被更新了。扫描完后找出最大值就return出去即可。

最后是程序效果图:

完整代码在个人代码云:https://gitee.com/justinzeng/codes/nkw9d4tlhigx6p8ze0m1c100

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值