using
System;
using
System.Collections.Generic;
class
Graph{
private
static
int
V;
private
static
int
start;
public
static
int
max_depth = 0;
private
static
List<
int
>[] adj;
Graph(
int
v)
{
V = v;
adj =
new
List<
int
>[v];
for
(
int
i = 0; i < v; ++i)
adj[i] =
new
List<
int
>();
}
void
addEdge(
int
v,
int
w)
{
adj[v].Add(w);
}
void
find_depth(
bool
[]visited,
int
start,
int
depth)
{
visited[start] =
true
;
max_depth = Math.Max(max_depth, depth);
List<
int
> vList = adj[start];
foreach
(
var
n
in
vList)
{
if
(!visited[n])
find_depth(visited, n,
depth + 1);
}
}
void
dfs(
int
start,
bool
[]visited,
int
[]store_min_elements,
int
depth)
{
visited[start] =
true
;
store_min_elements[depth] = Math.Min(
store_min_elements[depth], start);
List<
int
> vList = adj[start];
foreach
(
var
n
in
vList)
{
if
(!visited[n])
dfs(n, visited,
store_min_elements,
depth + 1);
}
}
void
minSum_depth(
int
start,
int
total_nodes)
{
bool
[]visited =
new
bool
[total_nodes];
find_depth(visited, start, 0);
for
(
int
i = 0; i < visited.Length; i++)
{
visited[i] =
false
;
}
int
[]store_min_elements =
new
int
[max_depth + 1];
for
(
int
i = 0;
i < store_min_elements.Length;
i++)
{
store_min_elements[i] = Int32.MaxValue;
}
dfs(start, visited, store_min_elements, 0);
int
min_sum = 0;
for
(
int
i = 0;
i < store_min_elements.Length;
i++)
{
min_sum += store_min_elements[i];
}
Console.WriteLine(min_sum);
}
public
static
void
Main()
{
V = 7;
start = 0;
Graph g =
new
Graph(V);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(1, 6);
g.addEdge(2, 4);
g.addEdge(3, 5);
g.minSum_depth(start , V);
}
}