import
java.util.*;
class
Main {
static
void
dfs(List<List<Integer>> adj, List<Integer> points,
List<List<Integer>> dp,
int
k,
int
curr,
int
par) {
for
(
int
x : adj.get(curr)) {
if
(par != x) {
dfs(adj, points, dp, k, x, curr);
}
}
int
pt = points.get(curr -
1
);
for
(
int
i =
0
; i <
30
; i++) {
int
sum2 = pt /
2
, sum1 = pt - k;
for
(
int
x : adj.get(curr)) {
if
(x != par) {
sum2 = sum2 + dp.get(x).get(i +
1
);
sum1 = sum1 + dp.get(x).get(i);
}
}
pt = pt /
2
;
dp.get(curr).set(i, Math.max(sum1, sum2));
}
}
static
int
maximumPoints(List<List<Integer>> edges,
List<Integer> points,
int
k) {
int
n = points.size();
List<List<Integer>> adj =
new
ArrayList<>(n +
1
);
for
(
int
i =
0
; i <= n; i++) {
adj.add(
new
ArrayList<>());
}
for
(List<Integer> edge : edges) {
adj.get(edge.get(
0
)).add(edge.get(
1
));
adj.get(edge.get(
1
)).add(edge.get(
0
));
}
List<List<Integer>> dp =
new
ArrayList<>(n +
1
);
for
(
int
i =
0
; i <= n; i++) {
dp.add(
new
ArrayList<>(
31
));
for
(
int
j =
0
; j <
31
; j++) {
dp.get(i).add(
0
);
}
}
dfs(adj, points, dp, k,
1
, -
1
);
int
ans =
0
;
for
(
int
i =
0
; i <
31
; i++) {
ans = Math.max(ans, dp.get(
1
).get(i));
}
return
ans;
}
public
static
void
main(String[] args) {
int
N =
5
;
int
k =
4
;
List<List<Integer>> edges = List.of(
List.of(
1
,
2
),
List.of(
1
,
3
),
List.of(
1
,
4
),
List.of(
2
,
5
)
);
List<Integer> points = List.of(
7
,
0
,
9
,
5
,
3
);
System.out.println(maximumPoints(edges, points, k));
}
}