当前位置:首页 > 大全 >

kruskal算法适用于求 的网的最小生成树(kruskal 算法中文)

来源:原点资讯(www.yd166.com)时间:2022-12-19 22:11:28作者:YD166手机阅读>>

那么显然这两条边之间并不会引起冲突,所以我们可以都保留。所以这不会引起反例。

第二种情况是这两条边连通三个不同的集合:

kruskal算法适用于求 的网的最小生成树,kruskal 算法中文(9)

这种情况和上面一样,我们可以都要,并不会影响连通情况。所以也不会引起反例。

最后一种是这两条边连通的是两个集合,也就是下面这样。

kruskal算法适用于求 的网的最小生成树,kruskal 算法中文(10)

在这种情况下,这两条件之间互相冲突,我们只能选择其中的一条。但是显然,不论我们怎么选都是一样的。因为都是连接了这两个连通块,然后带来的价值也是一样的,并不会影响最终的结果

当我们把所有情况列举出来之后,我们就可以明确,在这个问题当中贪心法是可行的,并不会引起反例,所以我们可以放心大胆地用。

实际问题与代码实现

明白了算法原理之后,我们来看看这个算法的实际问题。其实这个算法在现实当中的使用蛮多的,比如自来水公司要用水管连通所有的小区。而水管是有成本的,那么显然自来水公司希望水管的总长度尽量短。比如山里的村庄通电,要用尽量少的电缆将所有村庄连通,这些类似的问题其实都可以抽象成最小生成树来解决。当然现实中的问题可能没有这么简单,除了考虑成本和连通之外,还需要考虑地形、人文、社会等其他很多因素。

最后,我们试着用代码来实现一下这个算法。

classDisjointSet: def__init__(self,element_num=None): self._father={} self._rank={} #初始化时每个元素单独成为一个集合 ifelement_numisnotNone: foriinrange(element_num): self.add(i) defadd(self,x): #添加新集合 #如果已经存在则跳过 ifxinself._father: return self._father[x]=x self._rank[x]=0 def_query(self,x): #如果father[x]==x,说明x是树根 ifself._father[x]==x: returnx self._father[x]=self._query(self._father[x]) returnself._father[x] defmerge(self,x,y): ifxnotinself._father: self.add(x) ifynotinself._father: self.add(y) #查找到两个元素的树根 x=self._query(x) y=self._query(y) #如果相等,说明属于同一个集合 ifx==y: return #否则将树深小的合并到树根大的上 ifself._rank[x]<self._rank[y]: self._father[x]=y else: self._father[y]=x #如果树深相等,合并之后树深 1 ifself._rank[x]==self._rank[y]: self._rank[x] =1 #判断是否属于同一个集合 defsame(self,x,y): returnself._query(x)==self._query(y) #构造数据 edges=[[1,2,7],[2,3,8],[2,4,9],[1,4,5],[3,5,5],[2,5,7],[4,5,15],[4,6,6],[5,6,8],[6,7,11],[5,7,9]] if__name__=="__main__": disjoinset=DisjointSet(8) #根据边长对边集排序 edges=sorted(edges,key=lambdax:x[2]) res=0 foru,v,winedges: ifdisjoinset.same(u,v): continue disjoinset.merge(u,v) res =w print(res)

其实主要都是利用并查集,我们额外写的代码就只有几行而已,是不是非常简单呢?

结尾

相信大家也都感觉到了Kruskal算法的原理非常简单,如果你是顺着文章脉络这样读下来,相信一定会有一种顺水推舟,一切都自然而然的感觉。也正是因此,它非常符合直觉,也非常容易理解,一旦记住了就不容易忘记,即使忘记了我们也很容易自己推导出来。这并不是笑话,有一次我在比赛的时候临时遇到了,当时许久不写Kruskal算法,一时想不起来。凭着仅有的一点印象,硬是在草稿纸上推导了一遍算法。

在下一篇文章当中我们继续研究最小生成树问题,一起来看另外一个类似但不相同的算法——Prim。

今天的文章就到这里,原创不易,需要你的一个关注,你的举手之劳对我来说很重要。

,

栏目热文

美心流心奶黄月饼价格(美心流心奶黄月饼券价格)

美心流心奶黄月饼价格(美心流心奶黄月饼券价格)

福州的施先生很喜欢香港的美心月饼,于是前段时间在网络购物平台上购买了几十盒,收到货后却发现疑点重重。消费者质疑买到“假...

2022-12-18 13:38:32查看全文 >>

明度对比色彩构成图片(色彩构成明度与纯度对比图片)

明度对比色彩构成图片(色彩构成明度与纯度对比图片)

在现代平面设计中,利用色彩的搭配可创造出适于表达设计主题特点的艺术效果。色彩的语言是丰富的,遵循色彩构成的均衡、韵律、强...

2023-10-21 00:12:33查看全文 >>

孙悟空简笔画图片大全 儿童画(简单孙悟空儿童画图片)

孙悟空简笔画图片大全 儿童画(简单孙悟空儿童画图片)

详情介绍:齐天大圣孙悟空简笔画画法步骤(卡通人物简笔画图片大全) 步骤一:画出孙悟空的眼睛轮廓;步骤二:画出孙悟空的眉...

2022-12-21 08:21:20查看全文 >>

夏季女军装套装裙(新式夏季女军装裙)

夏季女军装套装裙(新式夏季女军装裙)

无论是在明星博主穿搭中,还是在普通大众的出街Look中,半身裙都是夏季出镜率很高的单品。Fendi Spring Sum...

2022-12-13 02:29:55查看全文 >>

老公记不住老婆生日怎么办(结婚11年记不住老婆的生日怎么办)

老公记不住老婆生日怎么办(结婚11年记不住老婆的生日怎么办)

6月4日凌晨,李荣浩在微博零点准时为杨丞琳送上生日祝福,李荣浩已经连续六年零点微博发文为杨丞琳庆生了,对杨丞琳的称呼从“...

2023-02-04 05:25:47查看全文 >>

穿越火线段位(穿越火线段位差距多少可以一起打)

穿越火线段位(穿越火线段位差距多少可以一起打)

时间飞逝,一转眼我们穿越火线的枪王排位S22赛季已经进行了如此之久,据相关消息,我们穿越火线全新的版本更新会在11月之后...

2022-12-22 19:47:19查看全文 >>

人物描写片段200字高中(高中描写人物200字)

人物描写片段200字高中(高中描写人物200字)

江西上饶市某县致远中学高一学生胡鑫宇(后面称“胡同学”)已经失联一个多月了,很多人在关心这个15岁的男孩,希望他能早点回...

2022-12-16 13:53:04查看全文 >>

喜马拉雅下载的文件在哪里 iphone(苹果手机怎么找下载的喜马拉雅)

喜马拉雅下载的文件在哪里 iphone(苹果手机怎么找下载的喜马拉雅)

不少朋友喜欢用喜马拉雅听书、故事、各种主播分享的各种音频,因为听音频有一个好处,就是方便, 不用眼睛看,可以一边做事情,...

2022-12-26 00:06:58查看全文 >>

防疫精美句子20字(防疫优美短句)

防疫精美句子20字(防疫优美短句)

值得收藏的抗击疫情金句 1、基层需要的是口罩,而不是口号;需要的是消毒水,而不是口水。2、抗疫是当务之急、是头等大事,抗...

2023-02-01 01:31:12查看全文 >>

王者荣耀之最强主播txt(王者荣耀之竞技梦txt合集下载)

王者荣耀之最强主播txt(王者荣耀之竞技梦txt合集下载)

大家好,这里是正惊游戏,我是正惊小弟!在2020年元旦假期期间,“芜湖大司马不再直播英雄联盟匹配与排位模式”的消息迅速走...

2022-12-17 04:21:13查看全文 >>

文档排行