ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

漫画:什么是最小生成树?

2021-05-18 22:01:31  阅读:121  来源: 互联网

标签:最小 生成 已触 权值 漫画 顶点 节点


 小灰 程序员小灰 

图片

图片



—————  第二天  —————



图片

图片

图片


图片

图片

图片

图片



————————————



图片

图片

图片


图片

图片

图片


首先看看第一个例子,有下面这样一个带权图:


图片


它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


图片


去掉那些多余的边,该图的最小生成树如下:


图片



下面我们再来看一个更加复杂的带权图:


图片


同样道理,下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


图片



去掉那些多余的边,该图的最小生成树如下:


图片



图片


图片


图片


怎样铺设才能保证成本最低呢?


城市之间的交通网就像一个连通图,我们并不需要在每两个城市之间都直接进行连接,只需要一个最小生成树,保证所有的城市都有铁路可以触达即可。


图片



图片


图片


Prim算法是如何工作的呢?


这个算法是以图的顶点为基础,从一个初始顶点开始,寻找触达其他顶点权值最小的边,并把该顶点加入到已触达顶点的集合中。当全部顶点都加入到集合时,算法的工作就完成了。Prim算法的本质,是基于贪心算法


接下来说一说最小生成树的存储方式。我们最常见的树的存储方式,是链式存储,每一个节点包含若干孩子节点的指针,每一个孩子节点又包含更多孩子节点的指针:


图片


这样的存储结构很清晰,但是也相对麻烦。为了便于操作,我们的最小生成树用一维数组来表达,数组下标所对应的元素,代表该顶点在最小生成树当中的父亲节点。(根节点没有父亲节点,所以元素值是-1)


图片



下面让我们来看一看算法的详细过程:


1.选择初始顶点,加入到已触达顶点集合。


图片



2.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到2的边权值最小,把顶点2加入到已触达顶点集合,Parents当中,下标2对应的父节点是0。


图片


3.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从2到4的边权值最小,把顶点4加入到已触达顶点集合,Parents当中,下标4对应的父节点是2。


图片


4.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到1的边权值最小,把顶点1加入到已触达顶点集合,Parents当中,下标1对应的父节点是0。


图片


5.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从1到3的边权值最小,把顶点3加入到已触达顶点集合,Parents当中,下标3对应的父节点是1。


图片


这样一来,所有顶点都加入到了已触达顶点集合,而最小生成树就存储在Parents数组当中。


图片

图片

image.png

image.png

这段代码当中,图的存储方式是邻接矩阵,在main函数中作为测试用例的图和对应的邻接矩阵如下:

图片


当然,也可以使用邻接表来实现prim算法,有兴趣的小伙伴可以尝试写一下代码。



图片


图片



—————END—————



标签:最小,生成,已触,权值,漫画,顶点,节点
来源: https://blog.51cto.com/u_15127650/2784716

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有