import
java.util.*;
public
class
Main {
public
static
void
main(String[] args)
{
int
n =
7
;
ArrayList<ArrayList<Integer> > adj
=
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++) {
adj.add(
new
ArrayList<>());
}
adj.get(
0
).add(
2
);
adj.get(
0
).add(
1
);
adj.get(
1
).add(
3
);
adj.get(
4
).add(
1
);
adj.get(
5
).add(
2
);
adj.get(
5
).add(
6
);
adj.get(
6
).add(
0
);
adj.get(
6
).add(
4
);
PrintGraph(adj);
int
m_vertex = MotherVertex(adj);
if
(m_vertex == -
1
) {
System.out.println(
"Mother vertex is not existing in this graph"
);
}
else
{
System.out.println(
"Mother vertex is: "
+ m_vertex);
}
}
public
static
void
PrintGraph(ArrayList<ArrayList<Integer> > adj)
{
int
n = adj.size();
for
(
int
i =
0
; i < n; i++) {
for
(
int
x : adj.get(i)) {
System.out.println(
"There is an edge from "
+ i +
" to "
+ x);
}
}
}
public
static
boolean
IsEdge(ArrayList<ArrayList<Integer> > adj,
int
src,
int
dest)
{
for
(
int
x : adj.get(src)) {
if
(x == dest)
return
true
;
}
return
false
;
}
public
static
int
MotherVertexUtil(ArrayList<ArrayList<Integer> > adj,
int
index,
int
[] mask,
int
m_vertex)
{
int
n = adj.size();
if
(m_vertex != -
1
) {
return
mask[index];
}
if
(mask[index] !=
0
) {
return
mask[index];
}
int
tmpmask =
0
;
tmpmask |= (
1
<< index);
for
(
int
i =
0
; i < n; i++) {
if
((index != i) && IsEdge(adj, index, i)) {
if
(mask[i] ==
0
) {
int
retmask = MotherVertexUtil(
adj, i, mask, m_vertex);
tmpmask |= retmask;
}
else
{
tmpmask |= mask[i];
}
if
(tmpmask == (Math.pow(
2
, n) -
1
)) {
if
(m_vertex == -
1
) {
m_vertex = index;
}
return
tmpmask;
}
}
}
mask[index] |= tmpmask;
return
mask[index];
}
public
static
int
MotherVertex(ArrayList<ArrayList<Integer> > adj)
{
int
n = adj.size();
int
[] mask =
new
int
[n];
for
(
int
i =
0
; i < n; i++)
mask[i] =
0
;
int
tmpmask =
0
;
int
m_vertex = -
1
;
for
(
int
index =
0
; index < n; index++) {
tmpmask = (
1
<< index);
if
(mask[index] ==
0
) {
int
retmask = MotherVertexUtil(
adj, index, mask, m_vertex);
tmpmask |= retmask;
}
if
(tmpmask == (Math.pow(
2
, n) -
1
)) {
if
(m_vertex == -
1
) {
m_vertex = index;
}
break
;
}
mask[index] |= tmpmask;
}
return
m_vertex;
}
}