using
System;
using
System.Collections.Generic;
class
Graph {
public
int
V;
public
List<List<
int
> > adj;
public
Graph(
int
V)
{
this
.V = V;
adj =
new
List<List<
int
> >(V);
for
(
int
i = 0; i < V; i++)
adj.Add(
new
List<
int
>());
}
public
void
addEdge(
int
u,
int
v) { adj[u].Add(v); }
void
dfs_helper(
int
u, List<List<
int
> > adj,
bool
[] visited)
{
if
(visited[u])
return
;
visited[u] =
true
;
foreach
(
var
v
in
adj[u])
{
if
(!visited[v])
dfs_helper(v, adj, visited);
}
}
void
getTransposeGraph(List<List<
int
> > adj,
List<List<
int
> > trans_adj)
{
for
(
int
u = 0; u < adj.Count; u++) {
foreach
(
var
v
in
adj[u])
{
trans_adj[v].Add(u);
}
}
}
void
initialize_visited(
bool
[] visited,
int
n)
{
for
(
int
u = 0; u < n; u++)
visited[u] =
false
;
}
public
List<
int
> findAllMotherVertices()
{
bool
[] visited =
new
bool
[V];
initialize_visited(visited, V);
int
last_dfs_called_on = -1;
for
(
int
u = 0; u < V; u++) {
if
(!visited[u]) {
dfs_helper(u, adj, visited);
last_dfs_called_on = u;
}
}
initialize_visited(visited, V);
dfs_helper(last_dfs_called_on, adj, visited);
for
(
int
u = 0; u < V; u++) {
if
(!visited[u]) {
List<
int
> emptyList =
new
List<
int
>();
emptyList.Add(-1);
return
emptyList;
}
}
int
motherVertex = last_dfs_called_on;
List<List<
int
> > trans_adj
=
new
List<List<
int
> >(V);
for
(
int
i = 0; i < V; i++)
trans_adj.Add(
new
List<
int
>());
getTransposeGraph(adj, trans_adj);
initialize_visited(visited, V);
dfs_helper(motherVertex, trans_adj, visited);
List<
int
> ans =
new
List<
int
>();
for
(
int
u = 0; u < V; u++) {
if
(visited[u])
ans.Add(u);
}
return
ans;
}
}
class
Program {
public
static
void
Main()
{
int
V = 8;
Graph g =
new
Graph(V);
g.addEdge(0, 1);
g.addEdge(1, 2);
g.addEdge(1, 4);
g.addEdge(1, 5);
g.addEdge(2, 3);
g.addEdge(2, 6);
g.addEdge(3, 2);
g.addEdge(3, 7);
g.addEdge(4, 0);
g.addEdge(4, 5);
g.addEdge(5, 6);
g.addEdge(6, 5);
g.addEdge(6, 7);
List<
int
> motherVertices
= g.findAllMotherVertices();
if
(motherVertices[0] == -1)
Console.WriteLine(
"No mother vertex exists"
);
else
{
Console.Write(
"All Mother vertices of the graph are : "
);
foreach
(
var
v
in
motherVertices)
Console.Write(v +
" "
);
}
}
}