Problem
Givennnodes labeled from0ton - 1and 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
Givenn = 5andedges = [[0, 1], [1, 2], [3, 4]], return2.
Example 2:
0 4
| |
1 --- 2 --- 3
Givenn = 5andedges = [[0, 1], [1, 2], [2, 3], [3, 4]], return1.
Note:
You can assume that no duplicate edges will appear inedges. Since all edges are undirected,[0, 1]is the same as[1, 0]and thus will not appear together inedges.
思路一(dfs)
- 建一个map
- 0到n - 1, 如果没有被visited的话,过一遍
public int countComponents(int n, int[][] edges) {
List[] list = new List[n];
for (int i = 0; i < n; i++) {
list[i] = new ArrayList<Integer>();
}
for (int i = 0; i < edges.length; i++) {
int v1 = edges[i][0];
int v2 = edges[i][1];
list[v1].add(v2);
list[v2].add(v1);
}
boolean[] visited = new boolean[n];
int count = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs (list, i, visited);
count++;
}
}
return count;
}
private void dfs(List[] list, int node, boolean[] visited) {
visited[node] = true;
for (Object obj: list[node]) {
int adj = (int)obj;
if (visited[adj]) continue;
dfs(list, adj, visited);
}
}
思路二(union find)
- 传统union find思路, 查询有多少个独立的
public int countComponents(int n, int[][] edges) {
List[] list = new List[n];
for (int i = 0; i < n; i++) {
list[i] = new ArrayList<Integer>();
}
for (int i = 0; i < edges.length; i++) {
int v1 = edges[i][0];
int v2 = edges[i][1];
list[v1].add(v2);
list[v2].add(v1);
}
boolean[] visited = new boolean[n];
int count = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs (list, i, visited);
count++;
}
}
return count;
}
private void dfs(List[] list, int node, boolean[] visited) {
visited[node] = true;
for (Object obj: list[node]) {
int adj = (int)obj;
if (visited[adj]) continue;
dfs(list, adj, visited);
}
}