#Tree12. 树上区间分配
树上区间分配
练习 3:树上区间分配
题目描述:
给定一棵以 1 为根的有根树,每个结点 i 需要占用一个时间区间 [s_i, e_i]。现在要安排所有结点的执行时间,要求:
- 如果结点
u是结点v的父结点,则u的执行时间必须在v之前(即e_u < s_v) - 每个结点的执行时间不能超过其要求的区间范围
问:是否存在一种安排方案?如果存在,输出 YES 和一种可行方案(每个结点的实际执行区间);否则输出 NO。
输入格式:
- 第一行:一个正整数
n(2 ≤ 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)
输出格式:
- 第一行:
YES或NO - 如果为
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]无法满足这个要求,则无解