并查集
- 用于解决连通性问题
- union和is_same_set可看作O(1)时间复杂度
class UnionFindSet: def __init__(self, elements): self.father = {} self.rank = {} for i in elements: self.father[i] = i self.rank[i] = 1 def find_head(self, element): stack = [] while self.father[element] != element: stack.append(element) element = self.father[element] while stack: tmp = stack.pop() self.father[tmp] = element return element def union(self, element1, element2): head1 = self.find_head(element1) head2 = self.find_head(element2) if head1 == head2: return rank1 = self.rank[head1] rank2 = self.rank[head2] if rank2 > rank1: head1, head2 = head2, head1 self.father[head2] = head1 self.rank[head1] += self.rank[head2] self.rank.pop(head2) def is_same_set(self, element1, element2): head1 = self.find_head(element1) head2 = self.find_head(element2) if head1 == head2: return True else: return False