树形DP
文章平均质量分 79
树形DP
Happig丶
我的孤独,虽败犹荣
展开
-
2020 CCPC 秦皇岛 K. Kingdom‘s Power(树形DP)
传送门题目大意给出一棵根节点为111的树,其中树根上面有无穷的士兵,每分钟我们能调取一队士兵走一条边,如果该节点没有被占领那么会占领该节点,问占领所有节点需要的最少时间。解题思路首先要能简单证明如下几个关键想法:对于某节点uuu,它要么被其兄弟子树上的士兵折返回来占领,要么就从根节点下来一队新的士兵占领。一队士兵到达节点uuu的子节点vvv后一定会继续向下走,要么停在叶子节点上,要么等到uuu的整个子树遍历完成后可能前往uuu的兄弟节点。对于每个节点来说,从根节点下来的士兵的路径原创 2021-03-03 20:00:57 · 690 阅读 · 1 评论 -
B - 树上子链 (带权树的直径,树形DP)
传送门最近在搞带权树的直径,搜到了这道题,就写一下吧首先不难发现是树形DP。这道题的状态应该是很好定义的,因为权值在点上而不是边上。首先考虑的一点应该是将这棵树变为有根树,那么设d(u)d(u)d(u)表示以节点uuu为根,延伸到子节点的最长路径的长度,因为题目说路径可以是节点本身,那么初始化就是这个点的权值。然后考虑状态转移方程,显然是考虑哪个叶子节点到该根节点的长度最长,那么就是d(u)=max(d(u),d(v)+w[u])d(u)=max(d(u),d(v)+w[u])d(u)=max(d(u原创 2020-08-19 09:58:26 · 624 阅读 · 0 评论 -
树的直径
树的直径对于一棵含有nnn个节点n−1n-1n−1条边的树,其直径定义为树上的最长链(最长路径)。而且容易得到,再连接首尾两点,会形成一个最大环求树的直径,可能会想到从某一节点出发先求一条最长路径,接着求和其不相交的次长路径。但是此做法比较麻烦。也还能对所有节点求一次最长路,取最长的,时间复杂度为O(n2)O(n^2)O(n2),也没戏。下面介绍求树的直径的两种思路:DFS和动态规划DFS思路:从任意一点uuu先做一次dfsdfsdfs找到最远的一点tailtailtail,在从tailtailta原创 2020-06-19 10:59:36 · 328 阅读 · 0 评论 -
P3629 [APIO2010] 巡逻(树的直径,树形DP)
传送门假设不连接道路,从111号节点走到所有的节点再回去恰好走了每条边两次。可以手玩一下样例,然后就可以发现这个规律当k=1k=1k=1时,不难发现,需要形成一个最大的基环树,联系到树的直径,其实就是求出树的直径lenlenlen然后连接起点终点,这样环上的边只走一次,总的次数为2∗(n−1)−len+12*(n-1)-len+12∗(n−1)−len+1,样例同样给出了图示当k=2k=2k=2时,可以猜想到是在111的基础上再连接一个环形成两个环(这个可以证明,但是由于赶时间就不说了)。那么在第原创 2020-08-19 19:50:27 · 155 阅读 · 0 评论 -
树形DP入门总结
常规树形DP洛谷P1352 没有上司的舞会题目大意有一棵树,每个节点都有权值,选点规则是若一个点的父节点被选择后那么该节点就不能被选择,求出选点的最大权值总和。(实际上就是最大独立集的带权情况)解题思路每个节点只能有两种状态,选或不选,父子节点的选择会依据树的结构特点互相制约,那么设d[u][0/1]d[u][0/1]d[u][0/1]代表节点uuu不选/选得到的最大权值和,那么有:若节点uuu被选那么其子节点vvv一定不会被选,即d[u][1]=wu+∑d[v][0]d[u][1] = w_原创 2021-03-02 09:14:49 · 258 阅读 · 0 评论 -
牛客 黑白树(树形DP)
传送门题目大意给出一颗以111为根的有根无权树,初始时所有的点都为白色,当我们选择一个点使其变黑,那么该点到根节点的那条链中距离该点长度小于k[i]k[i]k[i]的所有点都会变黑(已经变黑的无影响),求将整棵树都变黑的最少操作次数。解题思路首先一个点变黑影响的点只会是从该点向着根的方向的点,这个过程显然提醒我们,在dfs回溯过程中的方向就是每个点向着根节点的方向。如果一个子节点我们假设涂黑,那么它的父节点如何判断选或者不选?我们设一个数组ddd表示当前已涂黑节点(该节点或者下方子节点被涂黑)能再原创 2021-01-15 16:58:53 · 346 阅读 · 0 评论 -
树形DP——树的最大独立集
问题引入树的最大独立集:对于一棵nnn个节点的无根树,选出尽量多的节点,使得任何两个节点均不相邻,输出最大独立集的顶点个数方法一状态转移设d(i,k)d(i,k)d(i,k)表示以iii为根节点,选或不选对应的最大独立集大小d(i,0)d(i,0)d(i,0)表示该节点不选,那么下个节点可以选也可以不选,即d(i,0)+=max(d(son[i],0),d(son[i],1));{d(i,0)+=max(d(son[i],0),d(son[i],1));}d(i,0)+=max(d(son[i原创 2020-06-18 11:44:44 · 565 阅读 · 0 评论 -
UVA - 1218 Perfect Service(树形DP)
传送门树形DP实际上就是在dfs的过程中进行DP,此问题是树的最大独立集的一种变形,但是分析的方式一样设:d(u,0)d(u,0)d(u,0):uuu是服务器,每个子节点可以是服务器也可以不是d(u,1)d(u,1)d(u,1):uuu不是服务器但uuu的父亲是服务器,则uuu的所有子节点都不是服务器d(u,2)d(u,2)d(u,2):uuu和uuu的父亲都不是服务器,意味着uuu有且仅有一个儿子是服务器那么我们可以写出:d(u,0)=1+Σmin(d(v,0),d(v,1))d(u原创 2020-06-18 23:32:20 · 138 阅读 · 0 评论 -
树的重心
问题引入对于一棵nnn个节点的无根树,找到一个点,使得把该树变成以该点为根的有根树时,最大子树的节点数最小(删除这个点后的最大连通块最小)设d(i)d(i)d(i)为以iii为根节点的子树个数,则:d(i)=Σd(j)+1d(i)=Σd(j)+1d(i)=Σd(j)+1若节点iii的子节点为vvv,那么最后的答案就是使max(d(v),n−d(i))max(d(v),n-d(i))max(d(v),n−d(i))最小的节点iii代码vector<int> G[maxn];int d原创 2020-09-18 09:46:20 · 63 阅读 · 0 评论