P3177 [HAOI2015] 树上染色
P3177 [HAOI2015] 树上染色
题目描述
有一棵点数为 \(n\) 的树,树边有边权。给你一个在 \(0 \sim n\) 之内的正整数 \(k\) ,你要在这棵树中选择 \(k\) 个点,将其染成黑色,并将其他的 \(n-k\) 个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的收益。问收益最大值是多少。
输入格式
第一行包含两个整数 \(n,k\)。
第二到 \(n\) 行每行三个正整数 \(u, v, w\),表示该树中存在一条长度为 \(w\) 的边 \((u, v)\)。输入保证所有点之间是联通的。
输出格式
输出一个正整数,表示收益的最大值。
输入输出样例 #1
输入 #1
3 1
1 2 1
1 3 2
输出 #1
3
说明/提示
对于 \(100\%\) 的数据,\(0 \leq n,k \leq 2000\)。
思路
这道题问到了树上任意两点点对相关问题以及有一个类似背包限制的 \(k\) ,所以说这道题枚举点对显然不可能接受。对于此类题型,一般会考虑单独将点或者边对答案的贡献进行处理,这道题因为又和路径有关,所以说应该考虑单独一条边对答案的贡献。
而这一贡献 \(w=sum1[u]*sum1[v]+sum2[u]*sum2[v]\)
那么想到这里就很好做了,考虑设 \(f_{i,j}\) 表示以 \(i\) 为根的子树中染了 \(j\) 个黑色点时,这颗子树对于答案贡献的最大值(包括 \(i\) 到其父节点的边),那么转移也就很好做了:
\[f_{u,j}=\max\{f_{v,k}+f_{u,j-k}\}
\]
然后就是注意树上背包不要写成 \(n^3\) 的了

浙公网安备 33010602011771号