写的有点快,有时间翻回来再深入理解下
适用于判断两个顶点是否连通,效率比深广度遍历高
两个顶点在一个集合里就是连通
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)