Connected Components
Problem Statement
Count the number of connected components in an undirected graph.
Example: Graph with edges [[0,1],[1,2],[3,4]] → 2 connected components: {0,1,2} and {3,4}
Approach 1: DFS
Explanation: Traverse unvisited nodes recursively; each traversal counts as a component.
Time Complexity: O(V + E)
Space Complexity: O(V) recursion stack
visited = set() count = 0 for node in all_nodes: if node not visited: DFS(node) count += 1
Approach 2: BFS
Explanation: Traverse using queue for unvisited nodes to find connected components.
Time Complexity: O(V + E)
Space Complexity: O(V)
visited = set() count = 0 for node in all_nodes: if node not visited: queue = [node] visited.add(node) while queue not empty: curr = queue.pop() for neighbor in curr.neighbors: if neighbor not visited: queue.push(neighbor) visited.add(neighbor) count += 1
Approach 3: Union-Find
Explanation: Merge connected nodes; the number of disjoint sets = number of components.
Time Complexity: O(E α(V))
Space Complexity: O(V)
parent = [i for i in range(V)] function find(x): if parent[x] != x: parent[x] = find(parent[x]) return parent[x] function union(x, y): parent[find(x)] = find(y) for each edge (u,v): union(u,v) count = number of unique parents