Description:
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:
Input: n = 5 and edges = [[0, 1], [1, 2], [3, 4]]
0 3
| |
1 --- 2 4
Output: 2
Example 2:
Input: n = 5 and edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
0 4
| |
1 --- 2 --- 3
Output: 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.
Analysis:
A classic problem for DSU.
Code:
class Solution {
public int countComponents(int n, int[][] edges) {
DSU dsu = new DSU(n);
for(int[] edge: edges) {
dsu.union(edge[0], edge[1]);
}
return dsu.getRs();
}
}
class DSU {
private int[] parent;
private int[] rank;
public DSU(int n) {
parent = new int[n];
for(int i = 0; i< parent.length; i++) {
parent[i] = i;
}
rank = new int[n];
}
public int find(int x) {
if(x != parent[x]) {
parent[x] = find(parent[x]);
}
return parent[x];
}
public void union(int x, int y) {
int xr = find(x);
int yr = find(y);
if(xr == yr) {
return;
}else{
if(rank[xr] < rank[yr]) {
parent[xr] = yr;
}else if(rank[xr] > rank[yr]) {
parent[yr] = xr;
}else{
parent[yr] = xr;
rank[xr]++;
}
}
}
public int getRs() {
int rs = 0;
for(int i = 0; i < parent.length; i++) {
if(i == parent[i]) {
rs++;
}
}
return rs;
}
}