adj = [[] for _ in range(n)]for v, w in edges: adj[v].append(w) adj[w].append(v)visited = [False] * ndef dfs(v): nonlocal adj, visited visited[v] = True deque((dfs(w) for w in adj[v] if not visited[w]), maxlen=0)counter = 0for v in range(n): if not visited[v]: counter += 1 dfs(v)return counter
class UnionFind(list): def __init__(self, n): super().__init__(range(n)) self.count = n def __getitem__(self, v): while True: p = super().__getitem__(v) if p == v: break v = p return p def union(self, u, v): if not self[u] == self[v]: self[self[u]] = self[v] self.count -= 1unionFind = UnionFind(n)for u, v in edges: unionFind.union(u, v)return unionFind.count