这道题我前前后后做了一年,共过了 4 4 4 遍,每次都有的新的理解;这次我认为自己理解透了,于是就写了一篇题解。
这道题是我入坑看到的第一道黑题(当时很萌,不知道黑题是什么,看到这题感觉很好玩),另外还有就是《切树游戏》和 Spiders Evil Plan,记载着我的回忆(
Description
Solution
算法一
为方便叙述,令树根为 1 1 1, w u , v w_{u,v} wu,v 表示 u , v u,v u,v 之间的边权, son { u } \text{son}\{u\} son{ u} 表示 u u u 的儿子组成的集合。
可以发现,答案即为 ⌈ \lceil ⌈ 在树上选出 k + 1 k+1 k+1 条不相交的路径 ⌋ \rfloor ⌋ 的最大边权和。
考虑 dp \text{dp} dp。
令 f u , i , j f_{u,i,j} fu,i,j 表示,看了以 u u u 为根的子树,子树内一共选了 i i i 条不相交的路径,且 u u u 当前度数为 j j j 的最大边权和。
- 若 j = 0 j=0 j=0,则目前没有包含 u u u 的路径。特别的,若以 u u u 为根的子树已经遍历完,则 f u , i , j f_{u,i,j} fu,i,j 表示所有该子树中的路径都被固定时的最大边权和(也就是说,遍历完子树后 f u , 0 f_{u,0} fu,0 对应的状态中 u u u 的度数可以为 0 0 0 或 1 1 1 或 2 2 2)。
- 若 j = 1 j=1 j=1,则目前恰有一条以 u u u 为一端的非固定路径(也就是说可以继续延伸出去,没有彻底固定这条路径的形态)。因为这条路径不固定,所以这条路径并没有被计入 i i i。
- 若 j = 2 j=2 j=2,则目前有一条包含 u u u 的路径,且其任意一端均不为 u u u(跨越了 u u u 的两个子树)。
考虑使用树形背包转移。具体来说,令目前要将以 v ( v ∈ son { u } ) v(v \in \text{son}\{u\}) v(v∈son{ u}) 为根的子树合并上来,则有转移:
f u , i , 0 : = max ( f u , i , 0 , max j = 0 i { f u , j , 0 + f v , i − j , 0 } ) f_{u,i,0}:=\max(f_{u,i,0},\max_{j=0}^i \{f_{u,j,0}+f_{v,i-j,0}\}) fu,i,0:=max(fu,i,0,j=0max

本文介绍了一种结合树形动态规划与二分搜索算法解决选取树上不相交路径最大权值和问题的方法。文章首先定义了状态转移方程,并通过树形背包的思想进行了状态转移,接着提出了一种利用二分搜索简化计算过程的方法。
最低0.47元/天 解锁文章
464

被折叠的 条评论
为什么被折叠?



