Given n
nodes labeled from 0
to n - 1
and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.
Example 1:
0 3 | | 1 --- 2 4
Given n = 5
and edges = [[0, 1], [1, 2], [3, 4]]
, return 2
.
Example 2:
0 4 | | 1 --- 2 --- 3
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
, return 1
.
class Solution { public: int countComponents(int n, vector<pair<int, int>>& edges) { vector<int> roots(n,-1); for(auto edge:edges) { int x = find(roots,edge.first); int y = find(roots,edge.second); if(x!=y) { roots[x] = y; n--; } } return n; } private: int find( vector<int> &roots,int i) { while(roots[i]!=-1) i = roots[i]; return i; } };
let us look at the DFS solution
class Solution { public: int countComponents(int n, vector<pair<int, int>>& edges) { unordered_map<int,vector<int>> mp; vector<bool> visited(n,false); for(auto edge:edges) { mp[edge.first].push_back(edge.second); mp[edge.second].push_back(edge.first); } int res = 0; for(int i = 0;i<n;i++) { if(!visited[i]) { dfs(i,mp,visited); res++; } } return res; } private: void dfs(int id,unordered_map<int,vector<int>>&mp,vector<bool>& visited) { vector<int> nexts = mp[id]; visited[id] = true; for(int i = 0;i<nexts.size();i++) { if(!visited[nexts[i]]) dfs(nexts[i],mp,visited); } } };