import
java.util.*;
class
GFG {
static
ArrayList<Integer> vertices =
new
ArrayList<>();
static
HashMap<pair, Integer> edges =
new
HashMap<>();
static
HashSet<ArrayList<Integer> > independentSets =
new
HashSet<>();
public
static
void
main(String args[])
{
int
numOfVertices =
4
, numOfEdges =
0
;
for
(
int
i =
1
; i <= numOfVertices; i++)
vertices.add(i);
HashSet<Integer> SolnSet =
new
HashSet<>();
findAllIndependentSets(
1
, numOfVertices, SolnSet);
ArrayList<Integer> Max =
new
ArrayList<>();
for
(ArrayList<Integer> i : independentSets) {
System.out.println(i);
if
(i.size() > Max.size())
Max = i;
}
System.out.println(
"Maximal Independent Set = "
+ Max);
}
static
void
findAllIndependentSets(
int
currentVertice,
int
setSize,
HashSet<Integer> SolnSet)
{
for
(
int
i = currentVertice; i <= setSize; i++)
{
if
(checkSafety(vertices.get(i -
1
), SolnSet)) {
SolnSet.add(vertices.get(i -
1
));
findAllIndependentSets(i +
1
, setSize,
SolnSet);
SolnSet.remove(vertices.get(i -
1
));
}
}
independentSets.add(
new
ArrayList<Integer>(SolnSet));
}
static
boolean
checkSafety(
int
vertex,
HashSet<Integer> SolnSet)
{
for
(
int
i : SolnSet) {
if
(edges.containsKey(
new
pair(i, vertex)))
return
false
;
}
return
true
;
}
static
class
pair {
int
first, second;
pair(
int
first,
int
second)
{
this
.first = first;
this
.second = second;
}
@Override
public
String toString()
{
return
"("
+ first +
","
+ second +
")"
;
}
}
}