这道题可以使用二分法+DFS来解决。可以二分答案 ,表示 Venn 最少需要多少武力值才能收集到至少 个货物。
具体做法是,我们首先遍历整棵树,计算出每个点向下子树(不包括父亲节点)的货物储备之和。然后从根节点开始 DFS,维护一个父节点表示当前已经经过的点,以及当前点向下子树的货物储备之和。
在 DFS 的过程中,如果当前点 的货物储备之和 加上之前遍历的所有点的货物储备之和 大于等于 ,则说明 Venn 可以在 武力值内收集到至少 个货物,可以将二分的答案上界调整为 。否则,则说明 Venn 不能在 武力值内收集到至少 个货物,需要将二分的答案下界调整为 。
最终,当二分的答案下界和上界相等时,这个值就是 Venn 最少需要的武力值。
n, W = map(int, input().split())
a = [0] + list(map(int, input().split()))
g = [[] for _ in range(n+1)]
# 构建树
for i in range(n-1):
u, v, w = map(int, input().split())
g[u].append((v, w))
g[v].append((u, w))
def dfs(u, fa, maxw): # 假设不存在环
cnt = 0
for v, w in g[u]: # 遍历子节点
if v == fa:
continue
if w <= maxw:
cnt += a[v-1]
cnt += dfs(v, u, maxw)
else:
continue
return cnt
l, r = 0, 1000000000
while l <= r:
mid = l + (r-l) // 2
if dfs(1, 0, mid) >= W:
r = mid - 1
else:
l = mid + 1
print(l)