[HAOI2009]毛毛虫 树形DP
题意:
给你一棵树,从树中取出一部分满足:是一条链+一些直接连在这条链上的节点
求节点数最多的合法取出部分。
题解:
其实这题还是不难?
观察到对于任意一条链,
只有两种情况: 一条路走到底 or 以某个点为中转
f[x]表示从x往下走,一路走到底的包括x的最优解,
f[x]包括x也包括father[x](将会加入它的贡献)
观察到以某个点为中转的情况:
倘若某条链以一个点为中转,那么这条链将无法向上产生贡献,
若没有,则变为第一种情况,且一定可以向上产生贡献, 以点x为中转的所有链都可以通过各个儿子的搭配得到
因此f[x]可以直接从f[son]中选取最优的来得到,
然后用f[x]来更新ans,
再选取儿子中的前2大,搭配起来加上x组成链,更新ans
所以dfs一遍然后输出ans即可,复杂度O(n);
细节还是挺多的,要注意。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define R register int 4 #define AC 350000 5 #define ACway 700000 6 #define getchar() *o++ 7 char READ[10001000],*o=READ; 8 int n,m,ans; 9 int in[AC],f[AC]; 10 int date[ACway],Head[AC],Next[ACway],tot; 11 /*观察到对于任意一条链,只有两种情况: 12 一条路走到底 :以某个点为中转 13 f[i]表示从i往下走,一条路走到底的最优解(不包括i)(非最长链) 14 但这样并不方便。。。。因为要分的情况太多, 15 所以f[x]表示从x往下走,一路走到底的包括x的最优解, 16 f[x]包括x也包括father[x] 17 观察到以某个点为中转的情况: 18 倘若某条链以一个点为中转,那么这条链将无法向上产生贡献, 19 若没有,则变为第一种情况。且一定可以向上产生贡献, 20 以点x为中转的所有链都可以通过各个儿子的搭配得到,*/ 21 22 inline int read() 23 { 24 int x=0;char c=getchar(); 25 while(c > '9' || c < '0') c=getchar(); 26 while(c >= '0' && c <= '9') x=x*10+c-'0',c=getchar(); 27 return x; 28 } 29 30 inline void upmax(int &a,int b) 31 { 32 if(b > a) a=b; 33 } 34 35 inline void add(int f,int w) 36 { 37 date[++tot]=w,Next[tot]=Head[f],Head[f]=tot; 38 date[++tot]=f,Next[tot]=Head[w],Head[w]=tot; 39 ++in[f],++in[w]; 40 } 41 42 void pre() 43 { 44 int a,b; 45 n=read(),m=read(); 46 for(R i=1;i<=m;i++) 47 { 48 a=read(),b=read(); 49 add(a,b); 50 } 51 } 52 53 void dfs(int x,int fa) 54 { 55 int now,maxn=0,maxn2=0; 56 f[x]=1 + in[x];//因为包括了自己,所以至少也是1 + in[x]了 57 for(R i=Head[x] ; i ;i=Next[i]) 58 { 59 now=date[i]; 60 if(now == fa) continue; 61 dfs(now,x); 62 upmax(f[x],f[now] + in[x] - 1);//因为既要加自己,又要减儿子,抵消了,所以只用加in就可以了 63 if(f[now] > maxn)//但是由于f[now]会包括x,所以也要减掉,,, 64 { 65 maxn2=maxn; 66 maxn=f[now]; 67 } 68 else upmax(maxn2,f[now]); 69 } 70 upmax(ans,f[x]); 71 upmax(ans,maxn + maxn2 + in[x] - 3);//同上,只不过多减一个儿子 72 }//因为也会包括x,所以会重复2次 73 74 void work() 75 { 76 dfs(1,0);//随便选个点做根节点吧 77 printf("%d\n",ans); 78 // for(R i=1;i<=n;i++) printf("%d %d\n",i,f[i]); 79 } 80 81 int main() 82 { 83 // freopen("in.in","r",stdin); 84 fread(READ,1,10000000,stdin); 85 pre(); 86 work(); 87 // fclose(stdin); 88 return 0; 89 }
转载于:https://www.cnblogs.com/ww3113306/p/9097545.html
[HAOI2009]毛毛虫 树形DP相关推荐
- P3174 [HAOI2009]毛毛虫(树形dp)
P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...
- [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. 输入输出格式 输入格式: 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...
- The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))
思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
- 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...
最新文章
- itoa函数的实现(不同进制)
- elegance suites bangkok info
- torch.stack(), torch.cat()用法详解
- XML的序列化和反序列化 详细介绍
- 文本文件的读写(字符流)
- 掌握这些Android开发热门前沿知识,跳槽薪资翻倍
- Ralink5350开发环境搭建
- python列表赋值 连续整数_列表切片赋值,小技巧(Python基础)。
- ElementUI项目优化上线
- Flink 数据类型
- 检测到目标服务器启用了TRACE方法
- 登录tomcat服务器首页直接跳转到项目
- UGUI Text组件扩展
- 记录10本关于开关电源的书
- linux 打包qt可执行文件
- 浅谈能耗分项计量监测系统在某大型公建的应用
- 《人月神话》读后感与读书笔记
- 经典算法-BF算法(字符串匹配)
- DNS、HTTP劫持的一些事
- 7.3 数字化的资产管理
热门文章
- 我是一只幼鸟,望着那蓝蓝的天空时不时就想翱翔起来
- 5款瞬间复活Win7/8/10工具
- 转换到coff期间_Visual Studio转换到coff期间失败该怎么解决?
- 2的17次方java中表示什么,2的17次方(11的余数是多少)
- 银行客户用户画像_客户分类、客户标签与用户画像,怎样助力转化?
- 标签、画像设计与模型落地
- 【渝粤题库】陕西师范大学200101 西方文学 作业(高起专)
- 学会演讲必看的五本书籍推荐
- 树莓派通过蓝牙进行串口通讯
- android停止补间动画,android 帧动画,补间动画,属性动画的简单总结