树算法笔记(一):并查集

写的有点快,有时间翻回来再深入理解下

适用于判断两个顶点是否连通,效率比深广度遍历高

两个顶点在一个集合里就是连通

class UnionFind(object):
    def __init__(self,n):
        self.uf=[i for i in range(n)]
        self.rank=[0 for i in range(n)] #树高度
        self.sets_count=n #集合个数
    
    def find_root(self,p):
        if uf[p]==p:
            return p
        else:
            uf[p]=self.find_root(uf[p])
            return 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]: #树低的一方合并到树高的一方
            uf[a]=b
        else:
            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)
可以直接留言交流问题或想法,每天都会看
原文地址:https://www.cnblogs.com/shitianfang/p/12426262.html