#Tree11. 树上最少选点覆盖所有边
树上最少选点覆盖所有边
练习 2:树上最少选点覆盖所有边
题目描述:
给定一棵以 1 为根的有根树,每条边有一个权值 c[i]。现在要选择一些结点,使得每条边至少有一个端点被选中。在满足条件的前提下,使得被选中结点的权值之和最小。
输入格式:
- 第一行:一个正整数
n(2 ≤ 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]))