kruskal算法_从《文明》游戏如何修路到数学中的最小生成树算法

女士们,先生们,老少爷们儿们!在下张大少。

《文明》游戏想来诸位并不陌生,筑成后需要在城市之间修路。在下这种懒癌晚期的玩家,显然会把这种无聊的工作委任给电脑。但说出来你可能不信,高手认为这其中蕴含着数学算法。

如图:把6座城市连起来,且道路的总长度越小越好。可有方法?

741b4903af8642ccdbdc873103b72403.png

闲言少叙,且看在下操作!

首先简化游戏画面,6座城市分别为A、B、C、D、E、F,两两之间标上距离。

e4da20cddd7a7d637edaf066c7aef1d7.png

由此可见,我们要求解的是上图的一个子图。此图要求6座城市相互连接,同时路的总长度最短。这便是数学中的最小生成树问题。

求解最小生成树有两种经典算法。一是普利姆(Prim)算法;二是克鲁斯卡尔(Kruskal)算法。

我们先看普利姆算法:

Step1,任取一顶点,我们取顶点A。

Step2,与A相连的边有3条,AB、AC、AD,取最短的边AB。

09256437bbba90eb8d3d9dec4cd835d3.png

Step3,与A、B相连的边有4条,AC、AD、BE、BF,取最短的边AD。

7a8dfb650171ce8d494d314b7ca18cd8.png

Step4,与A、B、D相连的边有5条,AC、CD、BE、BF、DE,取最短的边CD。

4b3395e33cc01b3154f418157bbb3b0c.png

Step5,与A、B、C、D相连的边有4条,AC、BE、BF、DE,取最短的边BE。

1a4e8ed75810118ce2055ea921e2648f.png

Step6,与A、B、C、D、E相连的边有4条,AC、BF、DE、EF,取最短的边EF。

03ac1acfa1723ccb7dddd735e7d1e394.png

搞定!6座城市皆已连通,可知道路的总长度为20。

接下来看看克鲁斯卡尔算法:

Step1,先把原图中的边删掉,只保留6座城市。

7d7b3c55b4ff800af71d1e0cd6eea7c6.png

Step2,在所有边中找出长度最短的一条,即AB=3。

23ccc9abac50dbba9b96ffb9116344d8.png

Step3,在剩余的边中继续找长度最短的边,此时AD、CD、EF都是4,观察可知A、C、D、E、F都在不同的连同分量上,所以把这三条边加入进来。

49ce111b3be43e66f0e826106b826e4a.png

Step4,在剩余的边中继续找长度最短的边,即BE=5,观察可知B、E分属两个不同的连同分量,所以把BE加进来。

255793642556cb1cd60ecc67da65ea90.png

搞定!结果跟普利姆算法一模一样!不用说也知道,这便是最优解。

游戏中修路如此,实际生活中的很多问题也如出一辙,例如城市之间铺设光缆,轨道建设,工程布网等,实际上都可以抽象成最小生成树问题。掌握以上两种算法,此类问题便迎刃立解。

张大少友情提醒:两种算法功能等效,但适用条件有所不同。因为二者的时间复杂度不同。普利姆算法适用于求解边稠密而顶点不多的场合;而克鲁斯卡尔算法适用于求解边稀疏的场合。若要深入了解,请老少爷们参考相关的算法教程,在下不再赘述。

青山不改,绿水长流,在下告退。

转发随意,转载请联系张大少本尊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值