#Tree18. 树上资源分配

树上资源分配

练习 9:树上资源分配

题目描述:

给定一棵以 1 为根的有根树,每个结点 i 需要 r[i] 个资源。现在有 m 个资源可以分配,分配规则:

  1. 资源只能从根向叶子传递(即父结点有资源才能传给子结点)
  2. 每个结点最多只能保留 c[i] 个资源(多余的要传给子结点)
  3. 在满足条件 1、2 的前提下,要使得所有结点的需求 r[i] 都得到满足

问:m 个资源是否足够?如果足够,输出 YES 和每个结点实际分配到的资源数;否则输出 NO

输入格式:

  • 第一行:两个正整数 n, m2 ≤ n ≤ 1001 ≤ 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

输出格式:

  • 第一行:YESNO
  • 如果为 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,则无解