时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
在幽暗深邃的魔法森林深处,矗立着一座由古老橡木编织而成的 “生命祭坛”。祭坛的能量脉络以树状结构分布,形成 n 个能量节点(编号 1 至 n,节点 1 是祭坛的核心源头)。每个节点蕴含两种力量:
生命灵气 a1:节点散发的滋养森林的灵气值
维系代价 bi:维持该节点运转所需消耗的魔法水晶数量
作为守护者,你需要激活部分节点来增强森林的生命力,但必须遵循祭坛的古老法则:
若激活节点 x,必须同时激活其所有 “溯源节点”—— 即从 x 沿能量脉络回溯至核心节点(节点 1)的所有节点(包括核心节点)。因为任何节点的能量流动都依赖于溯源节点构成的能量通道。
你携带的魔法水晶总量不超过 m,无法超额消耗。
你的使命是在魔法水晶总量允许的情况下,让被激活节点的生命灵气总和达到最大,以守护森林的平衡。
输入描述:
第一行:两个整数 n, m(1≤n≤100,1≤m≤1000),分别表示能量节点总数和魔法水晶上限。
第二行:n 个整数 a1,a2,…,an 代表每个节点的生命灵气值。(0<=a<=10000)
第三行:n 个整数 b1,b2,…,bn 代表每个节点的维系代价。(0<=b<=10000)
接下来 n-1 行:每行两个整数 u, v,表示两个节点间存在能量脉络(输入保证构成合法的树状结构)。
输出描述:
一个整数,表示最大的生命灵气总和。
示例1
输入
复制
5 12
6 2 4 3 5
4 3 2 1 5
1 2
1 3
2 4
3 5
示例2
输入
复制
5 7
5 3 2 4 2
3 4 1 2 1
1 2
1 3
1 4
1 5