#Tree12. 树上区间分配

树上区间分配

练习 3:树上区间分配

题目描述:

给定一棵以 1 为根的有根树,每个结点 i 需要占用一个时间区间 [s_i, e_i]。现在要安排所有结点的执行时间,要求:

  1. 如果结点 u 是结点 v 的父结点,则 u 的执行时间必须在 v 之前(即 e_u < s_v
  2. 每个结点的执行时间不能超过其要求的区间范围

问:是否存在一种安排方案?如果存在,输出 YES 和一种可行方案(每个结点的实际执行区间);否则输出 NO

输入格式:

  • 第一行:一个正整数 n2 ≤ n ≤ 100
  • 第二行:n-1 个正整数 f_2, f_3, ..., f_n,其中 f_i 表示结点 i 的父结点编号
  • 接下来 n 行:每行两个正整数 s_i, e_i,表示结点 i 的时间区间要求(1 ≤ s_i ≤ e_i ≤ 1000

输出格式:

  • 第一行:YESNO
  • 如果为 YES,接下来 n 行:每行两个整数,表示结点 i 的实际执行区间

样例输入:

3
1 1
1 5
2 6
3 7

样例输出:

YES
1 2
3 4
5 6

提示:

  • 贪心策略:DFS 后序遍历,从叶子开始安排
  • 对于每个结点 u,先安排所有子结点,然后 u 的执行时间必须晚于所有子结点的结束时间
  • 如果 u 的区间 [s_u, e_u] 无法满足这个要求,则无解