#Tree19. 树上任务调度
树上任务调度
练习 10:树上任务调度
题目描述:
给定一棵以 1 为根的有根树,每个结点 i 代表一个任务,需要执行时间 t[i]。现在有一个处理器,要按顺序执行这些任务,规则:
- 如果任务
u是任务v的父结点,则u必须在v之前执行 - 在满足条件 1 的前提下,要使得所有任务的总完成时间最小(总完成时间 = 所有任务的完成时间之和)
输入格式:
- 第一行:一个正整数
n(2 ≤ n ≤ 1000) - 第二行:
n-1个正整数f_2, f_3, ..., f_n,其中f_i表示结点i的父结点编号 - 第三行:
n个正整数t[1], t[2], ..., t[n],表示每个任务的执行时间(1 ≤ t[i] ≤ 100)
输出格式:
- 一行,一个整数,表示最小总完成时间
样例输入:
5
1 1 2 2
3 2 1 4 5
样例输出:
35
提示:
- 贪心策略:对于每个子树,按某种顺序执行子任务,使得总完成时间最小
- 树形 DP:
dp[u]表示执行完u子树所有任务的最小总完成时间 - 对于
u的多个子结点,需要决定执行顺序 - 贪心排序:如果子结点
v1和v2,比较dp[v1] + size[v1] * t[v2]和dp[v2] + size[v2] * t[v1],选择更优的顺序