树型dp

视频链接
(如果想购买网课,可以用我的邀请码)
用我的链接购买,我再反你10,一共花54多值
购买链接
不放心可以先加我好友2830872914

总试题链接
@[toc]

NC15033 小G有一个大树

树的重心定义为:树中的一个点,删掉该点,使剩下的树所构成的森林中最大的子树节点数最少。
dp[i]=max(n-tot[i],max(tot[k]))

NC511788 没有上司的舞会(最大独立集)

dp[i][0]不选i点时,i点及其子树能选出的最大快乐指数
dp[i][1]表示选择i点时,i点及其子树的最大快乐值
状态转移:
dp[i][0]=∑(max dp[j][0],dp[j][1])//当i点不选时,儿子选与不选
dp[i][1]=∑dp[j][0]+Hi//选了父亲,不能选儿子
(j是i的儿子)
边界:dp[i][0]=0 dp[i][1]=hi
结果:max(dp[root][0],dp[root][1])
本质:儿子与父亲不能同时选

poj1463 NC106060 Strategic game(树的最小点覆盖)

试题:一个树,在一个节点放兵,周围的边就被守护,问最少放多少兵
确定状态:
dp[x][1]以x为根的子树全被看住且在x上放置士兵的最少所需的士兵数量
dp[x][0]以x为根的子树全被看住且在x上没有 放置士兵的最少所需的士兵数量.
确定状态方程:
dp[x][1]=1+∑min(dp[i][0],dp[i][1])//x上放了士兵,x的儿子们可放可不放
dp[x][0]=∑dp[i][1]//如果x不放士兵,x的儿子必须放
结果min(dp[root][0],dp[root][1])
i是x的儿子
相当于我们在考虑x点时,x的子节点都是被考虑完的,x能否被覆盖完全取决于自身或x的儿子

NC24953 CellPhoneNetwork(树的最小支配集)

最少用多少个点可以覆盖掉所有其他点
确定状态:
dp[x][0]:选点i,并且以点i为根的子树都被覆盖
dp[x][1]:不选i,i被其儿子覆盖
dp[x][2]:不选点i,i被其父亲覆盖(此时儿子可选可不选)
转移方程:
dp[i][0]=1+∑min(dp[u][0],dp[u][1],dp[u][2])(u是i的儿子)
被儿子被自己被父亲覆盖

dp[i][2]=∑(dp[u][1],dp[u][0])
i被父亲覆盖,u是i的儿子,u 可选可不选,但是u肯定不会被i所覆盖

对于dp[i][1]情况,i的儿子们中必须有一个取dp[u][0]
if(i没有子节点)dp[i][1]=INF else dp[i][1]=∑min(dp[u][0],dp[u][1])+inc
对于inc
if(∑min(dp[u][0],dp[u][1])中包含某个dp[u][0])inc=0
else inc=min(dp[u][0]-dp[u][1])
选与不选
图一是自然被选
图二是强制选择
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

以上小总结:

最小点覆盖
每个点附近周围的边
最大独立集
父亲与儿子不能同时选,选最多的点
最小支配集
每个点附近周围的点

把子树当做一个整体

NC50505 二叉苹果树

一棵二叉苹果树,且一定分二叉, 给定需要保留的树枝数量,求最多能留住多少苹果
确定状态:
dp[u][v]以u为根的子树保留j个分支可以得到的最大苹果数量

左右儿子都在左右儿子都在
左子树砍了
在这里插入图片描述
三种情况:
只保留左
dp[u][j]=dp[l][j-1]+a[j][l]
只保留右
dp[u][j]=dp[r][j-1]+a[j][r]
左子树保留x个,右子树保留j-2-x个
dp[u][j]=dp[l][x]+dp[r][j-2-x]+a[j][l]+a[j][r]
a是指每条边的苹果树数量

延伸-->多叉树情况

不断将一个子树合并到左子树里,始终处理的只有两个子树
强行当做二叉树处理
在这里插入图片描述

树上背包
dp[u][j]=max(dp[u][k]+dp[v][j-k-1]+w)
v是u的子节点,k∈[0,j]
w=a[u][v]//u与v之间的边权
(发现该公式类似于背包)
在这里插入图片描述

NC202475 树上子链(树的直径)

每个点有点权
树的子链大小的这个子链上所有结点的权值和
在树T中找到最大的子链

树的直径:两边dfs
点权与边权转换

NC22598 Rinne Loves Edges

题意:
n个节点m条边的无向连通图(为树,m=n-1)
选取一个点S,然后删除一些边,使得原图中所有除S之外度为1的点都不能到达S(让叶子节点和根节点不通)
删边的费用为边的权值

可以跑网络流,全局最小割
树的话,没必要

考虑x点的子树上每个叶子都与s不连通
两种情况:
把x和他的儿子断开
在x的子树上取把所有叶子节点断开
dp[x]表示x的子树上的所有叶子和根断开的最小代价
dp[x]=∑(min(dp[y],dis[x][y]))
y是x的儿子
在这里插入图片描述

NC210473 吉吉王国

题目:
一棵无向树,切掉一些边,切断的边的权值不能超过m,使得叶子节点与根节点(1号)分离,要使得切断的边中最大的边权要尽可能小

最大值最小:二分
去二分最长能切的边
二分+判定
如果可以切就切断,如果x到y的边切不断(x是y的父亲节点),那就切y子树里面的节点,一直向下