using
System;
using
System.Collections.Generic;
class
Program
{
static
void
addEdge(List<
int
>[] adj,
int
u,
int
v)
{
adj[u].Add(v);
adj[v].Add(u);
}
static
void
FindMinOperationUtil(
int
[,] dp, List<
int
>[] adj,
int
[] A,
int
src,
int
parent)
{
dp[src, 0] = dp[src, 1] = 0;
foreach
(
int
V
in
adj[src])
{
if
(V == parent)
{
continue
;
}
FindMinOperationUtil(dp, adj, A, V, src);
dp[src, 0] = Math.Max(dp[src, 0], dp[V, 0]);
dp[src, 1] = Math.Max(dp[src, 1], dp[V, 1]);
}
A[src - 1] += dp[src, 0] - dp[src, 1];
if
(A[src - 1] > 0)
{
dp[src, 1] += A[src - 1];
}
else
{
dp[src, 0] += Math.Abs(A[src - 1]);
}
}
static
int
FindMinOperation(List<
int
>[] adj,
int
[] A,
int
V)
{
int
[,] dp =
new
int
[V + 1, 2];
FindMinOperationUtil(dp, adj, A, 1, 0);
int
minOperations = dp[1, 0] + dp[1, 1];
return
minOperations;
}
static
void
Main(
string
[] args)
{
int
V = 5;
List<
int
>[] adj =
new
List<
int
>[V + 1];
for
(
int
i = 0; i <= V; i++)
adj[i] =
new
List<
int
>();
addEdge(adj, 1, 2);
addEdge(adj, 1, 3);
int
[] A = { 1, -1, 1 };
int
minOperations = FindMinOperation(adj, A, V);
Console.WriteLine(minOperations);
}
}