题意简述
给定一个有$n$个节点的树,$n<=5e5$。每个点只能染精确的$k$种颜色,有无限种颜色珂供选择,但是每种颜色不能出现超过两次。如果一条边连接的两个点的两个颜色中有至少一个共同的,这条边就会产生它边权的权值。合理分配使权值最大,输出最大的权值。
思路框架
设$dp[i][0/1]$表示以$i$为根,是/否选择$i$到$i$的父亲那一条边,的最大权值和。转移即珂。
具体思路
分两个部分。
Part 1. 状态
那么我们为什么这么设状态呢。。。
套路
原因是这样的,我们一开始肯定能想到设前面的$dp[i]$表示以$i$为根的答案。但是,如果只有这个,我们很难判断一个儿子是否能连上来,因为要连上来就需要有一个颜色与父亲对应,而和儿子只能用$k-1$个颜色,这状态就不对,或者说,我们少一个状态。
所以我们考虑设$dp[i][0/1]$,加上后面那一维。
Part 2. 转移
首先,把所有儿子的$dp[son][1]$加起来显然是一种选择。记这个默认值为$S$。
然后我们发现,还珂能有儿子连到父亲的边的情况。这种情况,就是$dp[son][0]+w$,$w$是这条边的边权。如果这种情况的确更好,我们要把$son$这个儿子的默认值$dp[son][1]$换成$dp[son][0]+w$,对$S$的影响很显然就是$S=S-dp[son][1]+dp[son][0]+w$。但是我们能接到儿子的边最多就只有$k$条,因为我们现在考虑的$u$点只能染$k$种颜色。
那咋整嘛。也好办,我们把后半部分$dp[son][0]+w-dp[son][1]$记下来,从大到小排个序。如果是$dp[i][1]$,选前面$k$个即珂;但是$dp[i][0]$只能选前面$k-1$个,因为还有留一个给父亲。当然,如果这个值是负的,说明选了之后不会更优。一个是负的,后面肯定都是负的了,于是直接 $break$掉,不管了。
然后就结束了
代码
1 |
|