#Tree18. 树上资源分配
树上资源分配
练习 9:树上资源分配
题目描述:
给定一棵以 1 为根的有根树,每个结点 i 需要 r[i] 个资源。现在有 m 个资源可以分配,分配规则:
- 资源只能从根向叶子传递(即父结点有资源才能传给子结点)
- 每个结点最多只能保留
c[i]个资源(多余的要传给子结点) - 在满足条件 1、2 的前提下,要使得所有结点的需求
r[i]都得到满足
问:m 个资源是否足够?如果足够,输出 YES 和每个结点实际分配到的资源数;否则输出 NO。
输入格式:
- 第一行:两个正整数
n, m(2 ≤ n ≤ 100,1 ≤ m ≤ 10000) - 第二行:
n-1个正整数f_2, f_3, ..., f_n,其中f_i表示结点i的父结点编号 - 第三行:
n个正整数r[1], r[2], ..., r[n],表示每个结点的需求(1 ≤ r[i] ≤ 100) - 第四行:
n个正整数c[1], c[2], ..., c[n],表示每个结点的容量(r[i] ≤ c[i] ≤ 1000)
输出格式:
- 第一行:
YES或NO - 如果为
YES,接下来n行:每行一个整数,表示结点i实际分配到的资源数
样例输入:
4 10
1 1 2
3 2 1 1
5 4 3 2
样例输出:
YES
3
2
1
1
提示:
- 贪心策略:DFS 后序遍历,从叶子开始向上传递资源
- 对于每个结点
u,先收集所有子结点的剩余资源,然后满足u的需求,多余的传给父结点 - 如果根结点收集的资源数 <
m,则无解