# Number of Connected Components ## Approach 1: [[dfs|DFS]] ```python adj = [[] for _ in range(n)] for v, w in edges: adj[v].append(w) adj[w].append(v) visited = [False] * n def dfs(v): nonlocal adj, visited visited[v] = True deque((dfs(w) for w in adj[v] if not visited[w]), maxlen=0) counter = 0 for v in range(n): if not visited[v]: counter += 1 dfs(v) return counter ``` ## Approach 2: [[union-find|Union Find]] ```python 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 -= 1 unionFind = UnionFind(n) for u, v in edges: unionFind.union(u, v) return unionFind.count ```