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.
Note:
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
1.用dfs
class Solution {
public:
int countComponents(int n, vector<pair<int, int> >& edges) {
vector<vector<int> > nl(n);
for (auto p : edges){
nl[p.first].push_back(p.second);
nl[p.second].push_back(p.first);
}
vector<int> visited(n, false);
int cnt = 0;
for (int i = 0; i < n; i++){
if (!visited[i]){
cnt++;
dfs(nl, visited, i);
}
}
return cnt;
}
private:
void dfs(vector<vector<int> >& nl, vector<int>&visited, int i){
if (visited[i]) return;
visited[i] = true;
for (int v : nl[i]){
if (!visited[v]){
dfs(nl, visited, v);
}
}
}
};
2.用并查集
class Solution {
public:
int countComponents(int n, vector<pair<int, int> >& edges) {
vector<int> s(n);
for (int i = 0; i < n; i++){
s[i] = i;
}
for (auto e : edges){
int ra = find(s, e.first);
int rb = find(s, e.second);
if (ra != rb){
s[ra] = rb;
}
}
int cnt = 0;
for (int i = 0; i < n; i++){
if (s[i] == i){
cnt++;
}
}
return cnt;
}
private:
int find(vector<int>&s, int x){
int r = x;
while (r != s[r]){
r = s[r];
}
int j = x;
while (s[j] != j){
int tmp = s[j];
s[j] = r;
j = tmp;
}
return r;
}
};