using
System;
using
System.Collections.Generic;
class
GFG
{
public
class
pair
{
public
int
first,second;
public
pair(
int
a,
int
b)
{
first = a;
second = b;
}
}
static
int
dfs(List<List< pair >> g,
pair []disRev, Boolean []visit,
int
u)
{
visit[u] =
true
;
int
totalRev = 0;
for
(
int
i = 0; i < g[u].Count; i++)
{
int
v = g[u][i].first;
if
(!visit[v])
{
disRev[v].first = disRev[u].first + 1;
disRev[v].second = disRev[u].second;
if
(g[u][i].second != 0)
{
disRev[v].second = disRev[u].second + 1;
totalRev++;
}
totalRev += dfs(g, disRev, visit, v);
}
}
return
totalRev;
}
static
void
printMinEdgeReverseForRootNode(
int
[,]edges,
int
e)
{
int
V = e + 1;
List<List< pair >> g =
new
List<List< pair >>();
for
(
int
i = 0; i < V + 1; i++)
g.Add(
new
List<pair>());
pair []disRev =
new
pair[V];
for
(
int
i = 0; i < V; i++)
disRev[i] =
new
pair(0, 0);
Boolean []visit =
new
Boolean[V];
int
u, v;
for
(
int
i = 0; i < e; i++)
{
u = edges[i, 0];
v = edges[i, 1];
g[u].Add(
new
pair(v, 0));
g[v].Add(
new
pair(u, 1));
}
for
(
int
i = 0; i < V; i++)
{
visit[i] =
false
;
disRev[i].first = disRev[i].second = 0;
}
int
root = 0;
int
totalRev = dfs(g, disRev, visit, root);
int
res =
int
.MaxValue;
for
(
int
i = 0; i < V; i++)
{
int
edgesToRev = (totalRev - disRev[i].second) +
(disRev[i].first - disRev[i].second);
if
(edgesToRev < res)
{
res = edgesToRev;
root = i;
}
}
Console.WriteLine(root +
" "
+ res);
}
public
static
void
Main(String []args)
{
int
[,]edges = {{0, 1}, {2, 1},
{3, 2}, {3, 4},
{5, 4}, {5, 6},
{7, 6}};
int
e = edges.GetLength(0);
printMinEdgeReverseForRootNode(edges, e);
}
}