using
System;
using
System.Collections.Generic;
public
class
GFG{
static
long
rmx = (
long
) 1e18;
static
long
dfs(
int
node,
int
num,
int
[]cap,
List<
int
> [] adj,
int
[] vis,
int
start)
{
vis[node]=1;
long
ans = cap[node - 1];
long
mx = 0;
foreach
(
int
child
in
adj[node]) {
if
(vis[child]!=1) {
long
cdfs
= dfs(child, num, cap, adj,
vis, start);
if
(cdfs == -1) {
mx = -1;
break
;
}
mx = Math.Max(mx, cdfs);
}
}
if
(mx == -1)
return
-1;
if
(node == start)
ans += adj[node].Count * mx;
else
ans += (adj[node].Count - 1) * mx;
if
(ans > rmx)
return
-1;
return
ans;
}
static
long
minimum_amount(
int
[,] Edges,
int
num,
int
start,
int
[]cap)
{
List<
int
> []adj =
new
List<
int
>[num + 1];
for
(
int
i = 0; i < num + 1; i++)
adj[i] =
new
List<
int
>();
int
[]vis =
new
int
[num + 1];
for
(
int
i = 0; i < Edges.GetLength(0); i++) {
adj[Edges[i,0]].Add(Edges[i,1]);
adj[Edges[i,1]].Add(Edges[i,0]);
}
return
dfs(start, num, cap, adj, vis, start);
}
public
static
void
Main(String[] args)
{
int
num = 4, start = 1;
int
[]cap = { 1, 1, 1, 1 };
int
[,] Edges
= { { 1, 2 }, { 1, 3 }, { 2, 4 } };
Console.Write(minimum_amount(Edges, num, start, cap));
}
}