想一下,把一条边弄成(0),然后连起来
那这条边有毛价值,神经病
所以题意是树上选(m+1)条链,权值和最大
我们令每个点的点权为父边的边权
考虑一个我想不到的暴力(dp)
(f[u][j][0/1/2])表示以(u)为根的子树,已经选了(j)条链,当前节点被选择与(0/1/2)个节点相连的最大价值
当(u)与(0)个节点相连时,直接从子树中选(m)条链
(f[u][j][0]=max{f[v][k][0]+f[u][j-k][0]})
当(u)与(1)个节点相连时,讨论从已经处理的子树中选还是从新子树中选
(f[u][j][1]=max{f[u][k][0]+f[v][j-k][1]+a[i].val,f[u][k][1]+f[v][j-k][0]})
当(u)与(2)个节点相连时,说明这条链的端点分别在两个子树内,我们讨论自己和儿子拼起来和原本子树中已经有了的情况
(f[u][j][2]=max{f[u][k][1]+f[v][j-k-1][1]+a[i].val,f[u][k][2]+f[v][j-k][0]})
中间(j-k-1)是因为我们不把(1)算作已经选出的链,但是(0/2)都算作已经选择完毕的链
由于(1)不算作已经选出,所以可以从(0)和(m)转移,需要注意
然后为了向上传递方便,我们需要合并答案
(f[u][j][0]=max{f[u][j][0],f[u][j-1][1],f[u][j][2]})
暴力(dp)就做完了,如果加上下界优化应该是(O(nk)),但是我也不会证明
考虑选择的数量这个问题,感性的理解它应该是一个上凸函数,一开始会选价值最高的链,后面的链价值越来越低,斜率越来越小
那么可以考虑(WQS)二分,优化掉数量维,每选出一条链减去一定代价
最后算出最大价值选择的链数
成功优化到(O(nlogn))级别