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