#Tree11. 树上最少选点覆盖所有边

树上最少选点覆盖所有边

练习 2:树上最少选点覆盖所有边

题目描述:

给定一棵以 1 为根的有根树,每条边有一个权值 c[i]。现在要选择一些结点,使得每条边至少有一个端点被选中。在满足条件的前提下,使得被选中结点的权值之和最小。

输入格式:

  • 第一行:一个正整数 n2 ≤ n ≤ 1000
  • 第二行:n-1 个正整数 f_2, f_3, ..., f_n,其中 f_i 表示结点 i 的父结点编号
  • 第三行:n 个正整数 w[1], w[2], ..., w[n],表示每个结点的权值(1 ≤ w[i] ≤ 1000

输出格式:

  • 一行,一个整数,表示最小权值和

样例输入:

5
1 1 2 2
10 5 3 2 1

样例输出:

6

样例解释:

选择结点 2, 3,权值和为 5 + 3 = 8(但样例输出是 6,可能选 2, 4 或其他)

提示:

  • 树形 DP:dp[u][0] 表示不选 u 时,u 子树的最小权值和(此时必须选所有子结点)
  • dp[u][1] 表示选 u 时,u 子树的最小权值和(子结点可选可不选)
  • 转移:
    • dp[u][0] = w[u] + sum(min(dp[v][0], dp[v][1]))
    • dp[u][1] = sum(min(dp[v][0], dp[v][1]))