import
java.util.*;
class
Main {
static
void
dfs(
int
[] arr, List<Integer> dp,
int
v,
int
parent, List<List<Integer> > adj)
{
int
maxi = Integer.MIN_VALUE;
for
(
int
u : adj.get(v)) {
if
(u != parent) {
dfs(arr, dp, u, v, adj);
maxi = Math.max(maxi, arr[u]);
}
}
for
(
int
u : adj.get(v)) {
if
(u != parent) {
dp.set(v, dp.get(v) + dp.get(u) + maxi
- arr[u]);
}
}
arr[v] = arr[v] + maxi;
}
static
int
minimumCost(
int
N,
int
[][] edges,
int
[] arr)
{
List<Integer> dp
=
new
ArrayList<>(Collections.nCopies(N,
0
));
List<List<Integer> > adj =
new
ArrayList<>(N +
1
);
for
(
int
i =
0
; i <= N; i++) {
adj.add(
new
ArrayList<>());
}
for
(
int
i =
0
; i < N -
1
; i++) {
adj.get(edges[i][
0
]).add(edges[i][
1
]);
adj.get(edges[i][
1
]).add(edges[i][
0
]);
}
dfs(arr, dp,
0
, -
1
, adj);
return
dp.get(
0
);
}
public
static
void
main(String[] args)
{
int
N =
7
;
int
[][] edges = { {
0
,
1
}, {
0
,
2
}, {
1
,
3
},
{
1
,
4
}, {
2
,
5
}, {
2
,
6
} };
int
[] arr = {
1
,
5
,
2
,
2
,
3
,
3
,
1
};
System.out.println(minimumCost(N, edges, arr));
}
}