题意:

给你一棵树,从树中取出一部分满足:是一条链+一些直接连在这条链上的节点

求节点数最多的合法取出部分。

题解:

其实这题还是不难?

观察到对于任意一条链,

只有两种情况: 一条路走到底 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相关推荐

  1. P3174 [HAOI2009]毛毛虫(树形dp)

    P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...

  2. [HAOI2009]毛毛虫

    题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. 输入输出格式 输入格式: 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...

  3. The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))

    思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...

  4. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  5. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  6. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  7. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  8. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  9. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  10. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

最新文章

  1. itoa函数的实现(不同进制)
  2. elegance suites bangkok info
  3. torch.stack(), torch.cat()用法详解
  4. XML的序列化和反序列化 详细介绍
  5. 文本文件的读写(字符流)
  6. 掌握这些Android开发热门前沿知识,跳槽薪资翻倍
  7. Ralink5350开发环境搭建
  8. python列表赋值 连续整数_列表切片赋值,小技巧(Python基础)。
  9. ElementUI项目优化上线
  10. Flink 数据类型
  11. 检测到目标服务器启用了TRACE方法
  12. 登录tomcat服务器首页直接跳转到项目
  13. UGUI Text组件扩展
  14. 记录10本关于开关电源的书
  15. linux 打包qt可执行文件
  16. 浅谈能耗分项计量监测系统在某大型公建的应用
  17. 《人月神话》读后感与读书笔记
  18. 经典算法-BF算法(字符串匹配)
  19. DNS、HTTP劫持的一些事
  20. 7.3 数字化的资产管理

热门文章

  1. 我是一只幼鸟,望着那蓝蓝的天空时不时就想翱翔起来
  2. 5款瞬间复活Win7/8/10工具
  3. 转换到coff期间_Visual Studio转换到coff期间失败该怎么解决?
  4. 2的17次方java中表示什么,2的17次方(11的余数是多少)
  5. 银行客户用户画像_客户分类、客户标签与用户画像,怎样助力转化?
  6. 标签、画像设计与模型落地
  7. 【渝粤题库】陕西师范大学200101 西方文学 作业(高起专)
  8. 学会演讲必看的五本书籍推荐
  9. 树莓派通过蓝牙进行串口通讯
  10. android停止补间动画,android 帧动画,补间动画,属性动画的简单总结