python 实现并查集,复杂度常数级别
class UnionFind(object):
def __init__(self, n) -> None:
self.parent = [i for i in range(n)]
self.rank = n * [1]
def find(self, x):
'''寻找x的祖先节点'''
if x == self.parent[x]:
return x
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def is_same(self, x, y):
'''判断x和y是否有相同祖先,即是否连通'''
return self.find(x) == self.find(y)
def union(self, x, y):
'''合并两个节点,即让两个节点拥有共同的祖先'''
parent_x = self.find(x)
parent_y = self.find(y)
if parent_x != parent_y:
if self.rank[parent_x] < self.rank[parent_y]:
self.parent[parent_x] = parent_y
elif self.rank[parent_x] > self.rank[parent_y]:
self.parent[parent_y] = parent_x
else:
self.parent[parent_y] = parent_x
self.rank[parent_x] += 1