import
java.util.*;
class
GFG {
static
HashSet<Integer>[] sets =
new
HashSet[
2
];
static
boolean
bipartite(ArrayList<ArrayList<Integer>> edges,
int
V,
int
i,
ArrayList<Boolean> visited) {
if
(V ==
0
) {
return
true
;
}
ArrayList<Integer> pending =
new
ArrayList<>();
sets[
0
].add(i);
pending.add(i);
while
(pending.size() >
0
) {
int
current = pending.get(pending.size()-
1
);
visited.set(current,
true
);
pending.remove(pending.size()-
1
);
int
currentSet = sets[
0
].contains(current) ?
0
:
1
;
for
(
int
j =
0
; j < edges.get(current).size(); j++) {
int
neighbor = edges.get(current).get(j);
if
(!sets[
0
].contains(neighbor) && !sets[
1
].contains(neighbor)) {
sets[
1
- currentSet].add(neighbor);
pending.add(neighbor);
}
else
if
(sets[currentSet].contains(neighbor)) {
return
false
;
}
}
}
return
true
;
}
static
boolean
possibleBipartition(
int
V, ArrayList<ArrayList<Integer>> G) {
ArrayList<ArrayList<Integer>> edges =
new
ArrayList<>();
for
(
int
i =
0
; i <= V; i++) {
edges.add(
new
ArrayList<Integer>());
}
for
(ArrayList<Integer> v : G) {
edges.get(v.get(
0
)).add(v.get(
1
));
edges.get(v.get(
1
)).add(v.get(
0
));
}
ArrayList<Boolean> visited =
new
ArrayList<>(Collections.nCopies(V+
1
,
false
));
boolean
res =
true
;
for
(
int
i =
1
; i <= V; i++) {
if
(!visited.get(i)) {
res = res && bipartite(edges, V, i, visited);
}
}
return
res;
}
public
static
void
main(String[] args) {
int
V =
7
, E =
6
;
ArrayList<ArrayList<Integer>> G =
new
ArrayList<>();
G.add(
new
ArrayList<>(Arrays.asList(
1
,
2
)));
G.add(
new
ArrayList<>(Arrays.asList(
2
,
3
)));
G.add(
new
ArrayList<>(Arrays.asList(
3
,
4
)));
G.add(
new
ArrayList<>(Arrays.asList(
3
,
6
)));
G.add(
new
ArrayList<>(Arrays.asList(
5
,
6
)));
G.add(
new
ArrayList<>(Arrays.asList(
6
,
7
)));
sets[
0
] =
new
HashSet<Integer>();
sets[
1
] =
new
HashSet<Integer>();
if
(possibleBipartition(V, G)) {
for
(
int
elem : sets[
0
]) {
System.out.print(elem +
" "
);
}
System.out.println();
for
(
int
s : sets[
1
]) {
System.out.print(s +
" "
);
}
}
else
{
System.out.println(
"Not Possible"
);
}
}
}