class DisjointSet: def __init__(self, vertices): vertices = list(vertices) if len(set(vertices)) != len(vertices): raise ValueError("Repeated vertex") self.parent = {vertex: vertex for vertex in vertices} self.size = {vertex: 1 for vertex in vertices} self.components = len(vertices) def find(self, vertex): if vertex not in self.parent: raise ValueError("Unknown vertex") while self.parent[vertex] != vertex: self.parent[vertex] = self.parent[self.parent[vertex]] vertex = self.parent[vertex] return vertex def union(self, first, second): first, second = self.find(first), self.find(second) if first == second: return False if self.size[first] < self.size[second]: first, second = second, first self.parent[second] = first self.size[first] += self.size[second] self.components -= 1 return True groups = DisjointSet(["gate", "oak", "pond"]) print(groups.union("gate", "oak")) print(groups.union("oak", "gate")) print(groups.components) print(groups.find("gate") == groups.find("oak"))