0
点赞
收藏
分享

微信扫一扫

Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数

快乐小码农 2022-12-02 阅读 117


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;
}
};



举报

相关推荐

0 条评论