class UnionFind():
def __init__(self, n):
self.parent = list(range(n))
self.setcnt = n ## 连通分量数
self.size = [1]*n ## 每个连通分量的大小
def findset(self, x):
if self.parent[x] == x:
return x
return self.findset(self.parent[x])
def union(self, x, y):
x, y = self.findset(x), self.findset(y)
if x == y:
return
if self.size[x] < self.size[y]:
x, y = y, x
self.parent[y] = x
self.size[x] += self.size[y]
self.size[y] = 0
self.setcnt -= 1
def connect(self, x, y):
return self.finset(x) == self.findset(y)
优雅的写法: