import
java.util.*;
class
ConnectedComponents {
public
static
int
merge(
int
[] parent,
int
x) {
if
(parent[x] == x)
return
x;
return
merge(parent, parent[x]);
}
public
static
int
connectedComponents(
int
n, List<List<Integer>> edges) {
int
[] parent =
new
int
[n];
for
(
int
i =
0
; i < n; i++) {
parent[i] = i;
}
for
(List<Integer> x : edges) {
parent[merge(parent, x.get(
0
))] = merge(parent, x.get(
1
));
}
int
ans =
0
;
for
(
int
i =
0
; i < n; i++) {
if
(parent[i] == i) ans++;
}
for
(
int
i =
0
; i < n; i++) {
parent[i] = merge(parent, parent[i]);
}
Map<Integer, List<Integer>> m =
new
HashMap<>();
for
(
int
i =
0
; i < n; i++) {
m.computeIfAbsent(parent[i], k ->
new
ArrayList<>()).add(i);
}
for
(Map.Entry<Integer, List<Integer>> it : m.entrySet()) {
List<Integer> l = it.getValue();
for
(
int
x : l) {
System.out.print(x +
" "
);
}
System.out.println();
}
return
ans;
}
public
static
void
main(String[] args) {
int
n =
5
;
List<List<Integer>> edges =
new
ArrayList<>();
edges.add(Arrays.asList(
0
,
1
));
edges.add(Arrays.asList(
2
,
1
));
edges.add(Arrays.asList(
3
,
4
));
System.out.println(
"Following are connected components:"
);
int
ans = connectedComponents(n, edges);
}
}