#Tree19. 树上任务调度

树上任务调度

练习 10:树上任务调度

题目描述:

给定一棵以 1 为根的有根树,每个结点 i 代表一个任务,需要执行时间 t[i]。现在有一个处理器,要按顺序执行这些任务,规则:

  1. 如果任务 u 是任务 v 的父结点,则 u 必须在 v 之前执行
  2. 在满足条件 1 的前提下,要使得所有任务的总完成时间最小(总完成时间 = 所有任务的完成时间之和)

输入格式:

  • 第一行:一个正整数 n2 ≤ 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 的多个子结点,需要决定执行顺序
  • 贪心排序:如果子结点 v1v2,比较 dp[v1] + size[v1] * t[v2]dp[v2] + size[v2] * t[v1],选择更优的顺序