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

来源:互联网 发布:速达 sqlserver未安装 编辑:程序博客网 时间:2024/05/16 18:19

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 0