python 实现并查集,复杂度常数级别 class UnionFind(object): def __init__(self, n) -> None: # 存储x节点的祖先节点 self.parent = [i for i in range(n)] # 存储当前节点的深度 self.rank = n * [1] def find(self, x): '''寻找x的祖先节点''' if x == self.parent[x]: return x # 如果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]: # 如果x的这边深度比较少,修改x的祖先的父亲是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