323. Number of Connected Components in an Undirected Graph
Problem:
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
.
Analysis:
Standard union find problem. 如果有环的话component不会减少。
Solution:
Be careful with the corner case.
class Solution { class Union_Find { private int[] father; public int count = 0; public Union_Find(int n) { father = new int[n]; for (int i = 0; i < n; i++) { father[i] = i; } count = n; } public void connect(int a, int b) { int root_a = find(a); int root_b = find(b); if (root_a != root_b) { father[root_a] = root_b; count--; } } public int find(int n) { if (father[n] == n) return n; return father[n] = find(father[n]); } public boolean query(int a, int b) { int root_a = find(a); int root_b = find(b); return root_a == root_b; } } public int countComponents(int n, int[][] edges) { if (n < 2) return n; int m = edges.length; Union_Find uf = new Union_Find(n); for (int i = 0; i < m; i++) { uf.connect(edges[i][0], edges[i][1]); } return uf.count; } }
评论
发表评论