并查集模板
具体的细节可以看https://zhuanlan.zhihu.com/p/93647900,非常干货!
Python版并查集模板,结合了路径压缩和按秩合并:
class UnionFind:
def __init__(self, n: int):
self.parents = list(range(n))
self.size = [1] * n
self.n = n
# 当前连通分量数目
self.setCount = n
# 查找根节点
def find(self, x: int):
if self.parents[x] == x:
return x
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
# 合并x,y节点
def unite(self, x: int, y: int):
x, y = self.find(x), self.find(y)
if x == y:
return False
if self.size[x] < self.size[y]:
x, y = y, x
self.parents[y] = x
self.size[x] += self.size[y]
self.setCount -= 1
return True
# 判断x,y节点是否连通
def connected(self, x: int, y: int):
x, y = self.find(x), self.find(y)
return x == y