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
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.Union find, easiest solution you can have.
public int countComponents(int n, int[][] edges) {
UnionFind unionFind = new UnionFind(n);
for (int[] e : edges) {
unionFind.union(e[0], e[1]);
}
return unionFind.size;
}
private class UnionFind {
int[] roots;
int size;
public UnionFind(int n) {
this.roots = new int[n];
Arrays.fill(roots, -1);
size = n;
}
public int find(int x) {
if (roots[x] < 0) {
return x;
}
roots[x] = find(roots[x]);
return roots[x];
}
//false if already in the same union
//true if successfully union these two vertices
public boolean union(int x, int y) {
if (x == y) {
return false;
}
int r1 = find(x);
int r2 = find(y);
if (r1 == r2) {
return false;
}
if (roots[r1] > roots[r2]) {
roots[r1] = r2;
} else {
if (roots[r1] == roots[r2]) {
roots[r1]--;
}
roots[r2] = r1;
}
size--;
return true;
}
}
No comments:
Post a Comment