首页 > 编程语言 > 详细

树算法笔记(二):Kruskal最小生成树

时间:2020-03-07 14:22:23      阅读:64      评论:0      收藏:0      [点我收藏+]

用到并查集判断连通性,效率很高,最终时间复杂度为O(nlogn)

思路:

1,先将边的权值从低到高排序

2,如果两个顶点已经连接便跳过,如果未连接就将其连接

3,当边数为顶点数-1时,最小生成树完成

class UnionFind(object):
    def __init__(self,n):
        self.uf=[i for i in range(n+1)]
        self.rank=[0 for i in range(n+1)] #树高度
        self.sets_count=n #集合个数
    
    def find_root(self,p):
        if self.uf[p]==p:
            return p
        else:
            self.uf[p]=self.find_root(self.uf[p])
            return self.uf[p]
    
    def unite(self,a,b):
        a=self.find_root(a)
        b=self.find_root(b)
        if a==b:
            return
        if self.rank[a]<self.rank[b]: #树低的一方合并到树高的一方
            self.uf[a]=b
        else:
            self.uf[b]=a #规定默认情况右边合并到左边
            if self.rank[a]==self.rank[b]:
                self.rank[a]+=1
        
    def is_connect(self,a,b):
        return self.find_root(a)==self.find_root(b)

data=‘‘‘2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2‘‘‘

lines=data.split("\n")
for i,line in enumerate(lines):
    lines[i]=list(map(int,line.split(" ")))
lines.sort(key=lambda line:line[2])

u=UnionFind(6)

#边数
count=0
mins=0
for minx in lines:
    if u.is_connect(minx[0],minx[1]):
        continue
    else:
        u.unite(minx[0],minx[1])
        count+=1
        mins+=minx[2]
        if count>=5:
            break

print(mins)

 

树算法笔记(二):Kruskal最小生成树

原文:https://www.cnblogs.com/shitianfang/p/12433999.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!