6.4最小生成树

假设你是电信实施工程师,需要为5个村庄架设通信网络做设计,即把这5个村庄都用电缆连接起来,要求用最小的成本来完成这项任务。村庄位置如下,连线之间数字表示村与村间可通达的直线距离,结点之间没有连线表示有高山或湖泊不予考虑。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-js7u2zAf-1637329801186)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119204126647.png)]

这个网用邻接矩阵法表示为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5OueA8yA-1637329801188)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119212836717.png)]

连接起这5个村庄至少要4条路径。显然,连通网(网的任意两个节点之间都有路径连接)生成树(包含图中全部顶点,但只有足以构成树的n-1条边)满足要求,比生成树路径还多显然浪费了资源,那么这个问题就转换成如何求连通网的最小生成树

主要有两种方法可以找到连通网的最小生成树,普里姆(Prim)法克鲁斯卡尔(Kruskal)算法。

1.普里姆(Prim)算法

我们先用普里姆算法来求上述的问题吧。遍历过程如下:

  • a旁有3条边18、12、16,12最小我们走12的路径作为最小生成树的第一条边。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PU2PORy-1637329801189)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119205503787.png)]

  • a和e两个顶点旁有其他边18、16、8、12,其中8最小,我们选择8作为最小生成树的第二条边。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSYx4sOc-1637329801190)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119205704908.png)]

  • a、e、b三个顶点旁有其他边16、21、22,16最小,我们选择16作为最小生成树的第三条边。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMrdUtlB-1637329801191)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119205944310.png)]

  • a、b、e、d四个顶点旁有其他边21、22、24其中21最小,我们选择21作为最小生成树的最后一条边。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WwNb3z5-1637329801191)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119210353131.png)]

    可以求出最小千米数为:12+8+16+24=60.

    从上述的例子可以得出普利姆法的思想:从连通网的任意一个结点开始,寻找已连通的结点的旁边权值最小的边(如果这条边连接已有的顶点则不算)连接的结点作为最小生成树的下一个结点,递归上述过程即可得到连通网的最小生成树。

2.克鲁斯卡尔(Kruskal)算法

普里姆算法是以某顶点为起点,逐步找个顶点上最小权值的边来构建最小生成树的。而卡鲁斯卡尔算法是从边的角度来构建最小生成树的。

首先通过邻接矩阵转为下图的边集数组,并按权值从小到大排序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ruvm7hPe-1637329801192)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119214036462.png)]

克鲁斯卡尔算法遍历过程如下:

  • 权值8为最短边(b,e)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdDuVp4w-1637329801193)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119214216251.png)]

  • 权值12为最短边(a,e)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgonH3Qe-1637329801193)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119214302712.png)]

  • 权值16为最短边(a,d)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDVPIe43-1637329801194)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119214352206.png)]

  • 权值18为最短边(a,b),但是a和b结点已经连通,因此选择权值为21的边(c,e)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SXfHKZxV-1637329801194)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\image-20211119214502088.png)]

这样就找到了最小生成树,和普里姆法结果一致。

通过上述结果可以得出卡鲁斯卡尔算法的思想:找出连通网中未标记的权值最小的边(边的两个顶点都是已经标记边的顶点则不算)未作为最小生成树的边,并标记。递归上述过程即可得到结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值