【树形DP】
文章平均质量分 68
张松超
这个作者很懒,什么都没留下…
展开
-
Codeforces ~ Garland ~ 767C (树形DP)
题意给你一个N个结点的树,每个结点有一个权值。现在要将数分为三部分,使得三部分的权值相等,输出分割的点。先输入N,然后接下来N行,每行输入 u 和 w,表示第 i 个结点和 u 有边,w表示第 i 个结点的权值。思路首先综合sum%3!=0sum\%3 != 0sum%3!=0肯定不行。dp[i]表示以 i 为根的树的权值和,dfs过程中统计子树权值即可,如果等于sum/3,那么就要...原创 2018-11-13 14:46:28 · 204 阅读 · 0 评论 -
洛谷 ~ P2458 [SDOI2006] ~ 保安站岗(树形DP,最小支配集变形)
注意他看守的是通道端点(即树中的点)思路看起来很像是最小点覆盖或最小支配集。但是最小点覆盖是去覆盖边的;最小支配集,一个点只可以被支配集中的一个点支配。而本题,需要支配点,但是一个点可以被多个点去支配,所以本题是最小支配集的一个变形。dp[u][0/1/2]dp[u][0/1/2]dp[u][0/1/2]表示以u为根的子树上的点全部被控制的答案。dp[u][0]dp[u][0]dp[u...原创 2018-12-21 19:18:23 · 361 阅读 · 0 评论 -
UVA ~ 1292 ~ Strategic game (树的最小点覆盖)
题意对于图G=(V,E)来说,最小点覆盖指的是从V中取尽量少的点组成一个集合,使得E中所有的边都与取出来的点相连。也就是说,设V‘是图G的一个顶点覆盖,则对于图中的任意一条边(u,v),要么u属于集合V’,要么v属于集合V‘。在V‘中除去任何元素后V’不在是顶点覆盖。输入有多组数据,每组先输入N,表示N个结点(0~n-1),然后N行输入这个N个结点的信息,每行第一个数字表示第i个结点的编...原创 2018-12-14 15:29:24 · 257 阅读 · 0 评论 -
洛谷 ~ P2014 ~ 选课 (树形背包)
思路树形背包的模板题。加一个虚拟的0结点然后选m+1个科目就OK。sz[u]sz[u]sz[u]表示以uuu为根的这棵子树的节点数目dp[u][j]dp[u][j]dp[u][j]表示uuu以uuu为根节点的子树,选取jjj门课且必须选自己的最优解。dp[u][j]=max(dp[u][j−k]+dp[v][k]),(j:min(m,sz[u])−>2)(k:1−&...原创 2018-12-14 13:34:06 · 536 阅读 · 0 评论 -
Codeforces ~ 1083A ~ The Fair Nut and the Best Path(树形DP,树的直径)
题意先输入N表示一棵有N个结点的树,然后输入N个点的点权,然后输入M条边。要求一条链,使得链上的∑\sum∑点权和-∑\sum∑边权和最大,输出这个最大值。思路显然是树的直径?dp[u]表示当前到u的最长链,那么ans=max(dp[u]+dp[e.v]−e.w)ans = max(dp[u]+dp[e.v]-e.w)ans=max(dp[u]+dp[e.v]−e.w),dp[u]=m...原创 2018-12-12 18:07:19 · 572 阅读 · 0 评论 -
洛谷 ~ P1273 ~ 有线电视网 (树形背包)
思路c[i]c[i]c[i]表示该用户愿意支出的钱sz[u]sz[u]sz[u]表示以u为根节点的子树有多少个用户。sz[u]+=sz[v]sz[u] += sz[v]sz[u]+=sz[v]dp[u][j]dp[u][j]dp[u][j]表示以uuu为根节点,转发到uuu个用户利润的最大值如果uuu为叶子结点即用户,则dp[u][0]=c[i]dp[u][0]=c[i]dp[u][0...原创 2018-11-14 21:03:36 · 206 阅读 · 0 评论 -
洛谷 ~ P1272 ~ 重建道路(树形背包)
思路我们转化一下,假设把所有的边先都删除,那么我们要考虑这条边是不是要加进去,这就是一个01背包+树形dp。定义deg表示uuu点的度数。定义dp[u][j]dp[u][j]dp[u][j]表示以uuu为根保留jjj个结点所需要删除的边数。dp[u][1]=deg[u]dp[u][1]= deg[u]dp[u][1]=deg[u]dp[u][j]=min(dp[u][j],dp[u][...原创 2018-11-14 10:53:59 · 243 阅读 · 0 评论 -
HDU ~ 2196 ~ Computer (树上最远距离)
题意给你一棵树,求每个点在树上的最远距离是多少?先输入N,表示有N个点,接来下N-1行输入v和w,表示2~n和第 i 个点和 v 之间有边,边权为w。思路放个西北工业大学在B站上的视频链接,大家自己去看吧。链接!!!#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+5;int n, dp...原创 2018-11-13 21:39:00 · 237 阅读 · 0 评论 -
POJ ~ 1655 ~ Balancing Act (树的重心)
题意树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。T组测试数据,每组输入N,然后输入N-1条边,求树的重心。输出重心和最大的子树节点数。思路模板//#include &lt;bits/stdc++.h&gt;#include &lt;iostream&gt;#include &lt;cstdio&...原创 2018-11-13 17:30:02 · 225 阅读 · 0 评论 -
洛谷 ~ P1352 ~ 没有上司的舞会 (树形DP)
思路dp[u][0]dp[u][0]dp[u][0]表示不选 u 点以 u 根的树的快乐值,dp[u][1]dp[u][1]dp[u][1]表示选上 u 点以 u 根的树的快乐值。dp[u][0]=∑max(dp[v][0],dp[v][1])dp[u][0] = \sum max(dp[v][0],dp[v][1])dp[u][0]=∑max(dp[v][0],dp[v][1])dp[u...原创 2018-11-13 16:50:06 · 689 阅读 · 0 评论 -
洛谷 ~ P1122 ~ 最大子树和 (树形DP)
思路dp[i]表示以i为根的树的最大值,对于一棵子树要么选,要么不选。最终求个最大值即可。#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+5;const int INF = 0x3f3f3f3f;int n, w[MAXN], dp[MAXN];vector<int> G[M...原创 2018-11-13 15:08:21 · 393 阅读 · 0 评论 -
UVA ~ 1218 ~ Perfect Service (树形dp,最小支配集)
题意补充本题是多组输入输出,每组先输入N,然后输入N-1条边,然后在输入一个flag,flag=-1表示结束。dp[u][2]=min(dp[u][2],dp[u][1]−dp[v][2]+dp[v][0]);dp[u][2] = min(dp[u][2], dp[u][1] - dp[v][2] + dp[v][0]);dp[u][2]=min(dp[u][2],dp[u][1]−dp...原创 2018-12-18 19:09:33 · 257 阅读 · 0 评论