![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树形dp
文章平均质量分 64
1
1E6
这个作者很懒,什么都没留下…
展开
-
[洛谷 P4099 HEOI2013] SAO (树形dp求方案数)
[洛谷 P4099 HEOI2013] SAO题目链接大致题意:给出一个树形图,求有多少种不同的拓扑序解题思路:如果你把这题看成拓扑图,多半你已经凉了……树形图,那么就和树没有什么区别,我们完全可以把它看作是一棵树,然后考虑方向的限制通常我们在树上跑dpdpdp,就是在做树形dpdpdp,设f[i]f[i]f[i]表示以iii为根的子树不同的拓扑方案数然而在转移的过程中可以发现,转移的序列是这样子的:xxxxxxUxxxxxxVxxxxxxxxxxxxUxxxxxxVxxxxxxxxx原创 2021-11-17 13:30:41 · 223 阅读 · 0 评论 -
[codeforces 708C] Centroids (二次扫描换根法)
[codeforces 708C] Centroids题目链接大致题意:给出一棵树,你可以选择断掉其中的一条边将其重新连接到任意一个节点上,使其形成一棵新树,请问有多少个节点可以通过这种操作成为树的重心解题思路:首先了解树的重心的概念,树的重心是所有子树大小都小于等于n/2n/2n/2的节点如果某一节点不是树的重心,那么这一节点有且仅有一个子树的大小超过了n/2n/2n/2,那么直观的想法就是从超过n/2n/2n/2的子树中取下小于等于n/2n/2n/2的最大节点数的一个子树,使其连在根节原创 2021-11-13 12:42:49 · 607 阅读 · 0 评论 -
[codeforces 1187E] Tree Painting (二次扫描换根法)
[codeforces 1187E] Tree Painting题目链接大致题意:给定一棵有 nnn个结点的无根树,所有结点都是白色的第一次操作可以随意使一个结点染成黑色,之后每次操作可以使一个与黑色结点相邻的白色结点变成黑色每次操作可以获得的权值为被染成黑色的白色结点所在的白色连通块的结点数量求可以获得的最大权值解题思路:我们可以利用树形dpdpdp求出某一点开始染色的权值,但如果循环跑nnn次树形dpdpdp,复杂度超了,那怎么解决呢?二次扫描换根法二次扫描换根法,顾名思义,就是原创 2021-11-11 12:19:40 · 484 阅读 · 0 评论 -
[洛谷 P6554] Promises I Can’t Keep(二次扫描换根法 好题)
[洛谷 P6554] Promises I Can’t Keep题目链接大致题意:我只是题面的搬运工这个电路有 n 个节点,每个节点有一个权值 val,以 n-1 条导线互相连通。你可以把电源接在任意一个起点上。接着,电流从这个节点开始流。若当前电源接到了一个节点 u,则接下来电流会等概率且不重复经过一个点地流向一个叶子节点,电流流过的所有节点的权值即为电路显示屏上的数(叶子节点即为 除了 u 的度数为 1 的节点)现在你有 n种接电源的选择,你希望接上电源以后期望得分越高越好,所以你现在就要原创 2021-11-10 19:12:29 · 426 阅读 · 0 评论 -
[codeforces 461B] Appleman and Tree (树形dp求方案数)
[codeforces 461B] Appleman and Tree题目链接大致题意:给出一棵以 1为根的树,除根之外有些点是黑色,有些点是白色。求有多少种划分方案数,使得将树划分成若干个连通块并且每个连通块有且仅有一个黑点解题思路:状态表示:f[i][0/1] 表示i点属于一个无黑点/有且只有一个黑点的联通块的方案数初始化:如果i点是黑色,f[i][1]=1,否则f[i][0]=1转移方程对于i点是黑色f[u][1] = f[u][0] * f[v][1] +原创 2021-11-10 09:12:08 · 184 阅读 · 0 评论 -
[洛谷 P3177 HAOI2015] 树上染色 (树形分组背包 经典)
[洛谷 P3177 HAOI2015] 树上染色题目链接大致题意:要求将k个点染成黑色,求黑点两两距离及白点两两距离,使他们之和最大解题思路:我们把点与点的距离化简为点到点之间边的计算,怎么把距离转化为边的计算呢,就是记录每一条边被经过的次数,也就是统计每条边的贡献求每一条边的贡献任务量很大,我们再降低难度,求某一条边的贡献边的贡献来源于它在两点的路径上,如果两点在同一侧,那对边没有贡献,只有在边的两侧,才会对边产生贡献,也就是说,边的两侧没有一对合法的点,边就会被经过一次,贡献就会加1原创 2021-11-09 16:47:31 · 142 阅读 · 0 评论 -
[洛谷 P1272] 重建道路 (树形背包 经典)
[洛谷 P1272] 重建道路题目链接大致题意:概述:删除最少数量的边,使得存在一棵节点数恰好是p个的子树解题思路:最常见的就是f[i][j]为以i为根的子树,保留j个节点拆掉的最小边数可以发现题解中各种初始化和转移琳琅满目,有的-1,有的-2.其实就是因为dp状态没有讲清楚先说第一种,f[i][j]表示以i为根的子树,保留j个节点,且当前子树与父节点相连,拆掉的最小边数每个状态代表一棵子树,这个子树与父节点相连初始化: f[i][1] = son[i] 一开始的点都是不连儿子只连原创 2021-11-09 11:05:57 · 238 阅读 · 0 评论 -
[洛谷 P2986 USACO10MAR] Great Cow Gathering G (换根dp 经典)
[洛谷 P2986 USACO10MAR] Great Cow Gathering G题目链接大致题意:有一颗树,你可以选定一个根节点,这个根节点的代价是∑c[i]∗dis[i],c[i]表示点i的点权值,dis[i]表示点i到根节点的距离解题思路:二次扫描换根法操作1:先处理出以1为根节点的时候的代价定义状态方程: f[i]表示i子树中所有点到i的代价转移方程:f[u] += f[v] + w * cnt[v] (cnt[i]表示i的子树中所有点权和)操作2:重新定义状态方程原创 2021-11-06 14:46:51 · 202 阅读 · 0 评论 -
[洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
[洛谷 P4084 USACO17DEC] Barn Painting G题目链接大致题意:给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数解题思路:f[i][j]表示i这个点上色为j是方案数(从下往上/从子节点向父节点更新)即对于所有初始节点,f[i][1],f[i][2],f[i][3]都为1当某个节点被指定上色后,那么该节点另外两种颜色的方案数为0。列如:当点x被指定上色 2 时:f[x][1]=0,f[x][3]=原创 2021-11-06 14:07:44 · 227 阅读 · 0 评论 -
[洛谷 P1273] 有线电视网 (树形分组背包)
[洛谷 P1273] 有线电视网题目链接大致题意:n个节点,m个叶子节点,根节点为1号点,每一条边都有一个边权,代表花费,叶子节点具有点权,代表收益问在总收益>=0的情况下,可以连通最多多少个叶子节点如果我简化题意不是很清楚,请看原题意解题思路:这个题不是很好想,如果我们把每棵子树看作是一个分组,那么组内可以不选叶子节点,可以选一个,可以选两个…也就是说,每一个组内最多只有一种决策,分组背包!!分组背包的状态表示是前i个组中,选j个物品的最大收益但是我们这是树形结构,要在加一原创 2021-11-06 10:51:03 · 197 阅读 · 0 评论 -
[洛谷 P1131 ZJOI2007] 时态同步 (树形dp)
[洛谷 P1131 ZJOI2007] 时态同步题目链接大致题意:n个点,n-1条边的无向树,根节点为s,每一条边有代价w加上最小的代价把所有叶子节点到根节点的距离调为相同解题思路:贪心去想怎样花费的代价最小呢,肯定是调整一次边,可以对多个叶子节点产生影响所以,调整越靠近根节点的边最终的代价越小例如以这种方式,就可以保证用最小的代价把所有叶子节点调整到同一深度定义状态方程:f[i]表示从i到i的子树的叶子节点的最长距离每次调整的代价为 f[u]-(f[v]+w) (w为u到v的原创 2021-11-05 19:45:17 · 171 阅读 · 0 评论 -
[codeforces] Choosing Capital for Treeland (换根dp)
[codeforces] Choosing Capital for Treeland题目链接大致题意:Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市。每条道路只能单向通行。现在政府需要决定选择哪个城市为首都。假如城市i成为了首都,那么为了使首都能到达任意一个城市,不得不将一些道路翻转方向,记翻转道路的条数为k。你的任务是找到所有满足k最小的首都。解题思路:二次扫描与换根法如果我能知道以每一个点为根节点,需要翻转道路的最小值就好了如果我们不能一次求出来,原创 2021-11-05 18:15:10 · 107 阅读 · 0 评论 -
[洛谷 P3478 POI2008] STA-Station(换根dp 入门)
[洛谷 P3478 POI2008] STA-Station题目链接大致题意:给定一个 n 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大一个结点的深度之定义为该节点到根的简单路径上边的数量解题思路:二次扫描与换根法以1为根以2为根可以发现,2的子树(包括2)深度都减少了1,1的子树(包括1)深度都增加了1定义状态方程 f[i]表示以i为根节点的所有结点的深度之和最大值 cnt[i]表示以i为根的子树的深度之和如果v的父亲节点是u那么f[v]=f[u原创 2021-11-05 16:01:33 · 273 阅读 · 0 评论 -
[洛谷 P2016] 战略游戏 (树形dp 经典)
[洛谷 P2016] 战略游戏题目链接大致题意:给出一棵包含n个节点的无根树,如果在i点放置一名守卫,那么这名守卫可以望到i点以及与i相连的边求放置最少的守卫,使得可以望到所有的边解题思路:经典题型本题是放置最少守卫可以望到所有边,换句话就是说一条边的两端节点必须选一个对于一个节点来说,我们只有两种选择,放或者不放,且每名守卫只能望到与他相连的边所以我们可以这样定义状态方程f[i][2] 表示在以i点为根节点不放守卫且满足条件的最少守卫或在以i点为根节点放守卫且满足条件的最少守卫如原创 2021-11-05 15:25:29 · 2435 阅读 · 0 评论 -
[洛谷 P2014 CTSC1997] 选课 (树形dp 经典)
[洛谷 P2014 CTSC1997] 选课题目链接大致题意:给定一棵含有 n 个结点的森林,且树上的每个点有一个权值 w依赖限制:选择v点必须选择v的父亲节点u点求选择m个点的最大权值和解题思路:如果是一棵树,就是选择包含根节点的联通块的最大权值和因为是森林,意味着至少有一棵树,也就是至少有一个根节点引用图论里的知识,建立超级源点的思路,题目中所有点编号全部大于等于1,建立一个超级根节点0,将森林中的每一棵树的根节点连向超级根节点,那么就变成了求包含超级根节点的联通块的最大权值和原创 2021-11-05 14:38:28 · 344 阅读 · 0 评论 -
[洛谷 P2015] 二叉苹果树 (树形dp 经典)
[洛谷 P2015] 二叉苹果树题目链接大致题意:给定一棵含有 n 个结点的树,树根编号为 1,且树上的每条边有一个边权 w要求我们只保留树中的 m 条边,使得树根所在的连通块的所有边边权之和最大解题思路:类似有依赖的背包问题,不过本题是边具有权值,而不是点本题的依赖性在于,说的完整一点就是当某条边被保留下来时,从根节点到这条边的路径上的所有边也都必须保留下来首先定义状态方程:f[i][j]表示i的子树上有j条边的最大边权和如果我们选择u的子节点v的子树上的边时,就一定要选择u,v的原创 2021-11-05 13:44:05 · 182 阅读 · 0 评论 -
[洛谷] P3174 [HAOI2009]毛毛虫 (树形dp 树的最长直径的扩展)
毛毛虫题目链接大致题意:总结来说,给出一棵树,让你求出一条链,使得这条链上的点和与这条链直接相连的点的总点数最大输出最大的总点数解题思路:树形dp (树的最长直径的扩展)不难发现,每一个结点对答案的贡献是该结点的度数减一那么我们可以把每个点的贡献值当为该点的权值,题目就可以转化为求一条权值和最大的链定义状态方程:f[i]表示以i为起点,一条权值和最大的链显然,我们不知道以哪个点位起点最优,不妨以1号点为起点,跑一遍dp,求出1号点权值和最大的一条链,记录尾节点为x,我们就可以确定x是原创 2021-11-02 08:47:59 · 195 阅读 · 0 评论 -
[洛谷] P1122 最大子树和 (树形dp)
P1122 最大子树和题目链接大致题意:总结来说,给出n个点,n-1条边,构成一棵树.每个节点有一个权值,可以为负,选择树中联通的一部分,使得该子树权值和最大,输出最大的权值和.解题思路:树形dp入门题定义状态方程:f[i]表示为以i节点为根的最大权值和从贪心的角度出发,遇到以i节点为根的子树和为负值,肯定不取.那么,我们的转移方程就可以写出来了f[u]+=max(0,f[v]) (v是属于u的子节点)AC代码:#include <bits/stdc++.h>原创 2021-11-01 22:01:13 · 450 阅读 · 0 评论 -
C. Vertex Deletion (树形dp)
C. Vertex Deletion题目链接大致题意:给出一个树,包含n个点,n-1条无向边.合法删点:删除一个点后,剩余的每个点都至少有一个点与其相连.求有多少合法的删点方案(mod 998244353)解题思路:树形dp+01背包的思想(删或不删)状态转移过程中,我们只对子树进行分析,对于u点,用到了01背包的思想,该点删or不删,我们分三种状态:1.删除u点,(子树内节点全部满足条件的方案)2.不删除u点,但u点的儿子中至少有一个点与u点相连,(子树内节点全部满足条件的方案)3.原创 2021-09-05 11:33:53 · 467 阅读 · 1 评论 -
Maximum White Subtree (树形dp)
Maximum White Subtree题目链接大致题意:给定一棵n个节点无根树,每个节点u有一个颜色a[u],若a[u]为0则u是黑点,若a[u]为1则u是白点对于每个节点u,选出一个包含u的连通子图,设子图中白点个数为cnt1,黑点个数为cnt2,请最大化cnt1−cnt2.并输出这个值.解题思路:树形dp对于一个节点来说,最大值的出现可能是它的其中一颗子树的最大值,或者是多颗子树最大值相加的结果.为了方便,我们定义以1为根,定义a[i]表示以i为根的子树的最大值,这里我们用一个dfs原创 2021-06-25 15:57:40 · 195 阅读 · 1 评论 -
Maximum Weight Subset (树形dp图文解释)
Maximum Weight Subset题目链接大致题意:给定一棵含 n个节点的树,每个节点含一个点权 w[i]要求选出一些节点,使得这些节点的权值和最大并且这些节点中任意两个节点的距离都 >k ,输出这个最大的权值解题思路:树形dp状态表示:f[i][j] 表示以i为根节点,深度是j的满足条件的最大值分析: f[i][j]有两种情况转移得来一是取根节点这个点权,然后取以距离根节点>k的点为根节点的满足条件的最大权值和用样例一来简单解释第一种情况:以1为根节点,k=1原创 2021-06-24 19:36:45 · 429 阅读 · 2 评论 -
毛毛虫 (树形dp)
毛毛虫题目链接大致题意:略~解题思路:求树的最长直径的扩展可以发现,每一个结点的贡献是该节点度-1,运用到求数的最长路径,就是把节点个数换成了节点的度数-1注意要特判n=1的情况以1为根节点,跑一遍dfs,求出距离根节点最远的一端x然后从x开始在跑一遍dfs,求出树的最长路径AC代码:#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define debug(a)原创 2021-06-16 16:12:51 · 748 阅读 · 0 评论 -
最长树链(树形dp)
题目链接: 最长树链大致题意:这个题应该默认树链的一段必须是根节点解题思路:建立单向边,找到根开始dfs,如果对于某个结点使得gcd值大于1就将其加入树链,记录深度的最大值最后输出即可AC代码:#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, root;vector<int>e[N];int w[N], du[N];int gcd(int a, int b)原创 2021-01-13 22:17:57 · 274 阅读 · 0 评论