这道题细节处理不少,但要AC不难;

设以i节点为根节点的子树能形成的最大的毛毛虫长度为f[i],则f[i]=max(f[j])+i节点的孩子数;

答案需要f最大和次大的两个子树合并,而且若合并的位置不是根节点,ans++;

我就是坑在了最后一点上,最后打表找到了问题;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=303000;
 6 int n,m,f[maxn],child[maxn];
 7 struct node{
 8     int y,next;
 9 }e[maxn<<1];
10 int linkk[maxn],len=0;
11 void insert(int x,int y){
12     e[++len].y=y;
13     e[len].next=linkk[x];
14     linkk[x]=len;
15 }
16 void init(){
17     scanf("%d%d",&n,&m);
18     int x,y;
19     for(int i=1;i<=m;i++){
20         scanf("%d%d",&x,&y);
21         insert(x,y);insert(y,x);
22     }
23 }
24 void dfs(int x,int fa){
25     for(int i=linkk[x];i;i=e[i].next){
26         if(e[i].y==fa)continue;
27         child[x]++;
28         dfs(e[i].y,x);
29     }
30 }
31 int ans=0;
32 void Dfs(int x,int fa){
33     if(child[x]==0){
34         f[x]=1;return;
35     }
36     int maxx[2]={0,0};
37     for(int i=linkk[x];i;i=e[i].next){
38         if(e[i].y==fa)continue;
39         Dfs(e[i].y,x);
40         f[x]=max(f[x],f[e[i].y]+child[x]);
41         if(f[e[i].y]>maxx[0])maxx[0]=f[e[i].y];
42         if(f[e[i].y]>maxx[1])maxx[0]=maxx[1],maxx[1]=f[e[i].y];
43     }
44     ans=max(ans,f[x]+maxx[0]-1);
45     if(x!=1)ans=max(ans,f[x]+maxx[0]);
46     if(maxx[0]==0)ans=max(ans,f[x]);
47 }
48 void work(){
49     dfs(1,0);
50     Dfs(1,0);
51     printf("%d\n",ans);
52 }
53 int main(){
54     freopen("1.in","r",stdin);
55     freopen("1.out","w",stdout);
56     init();
57     work();
58 }

View Code

转载于:https://www.cnblogs.com/chadinblog/p/5843779.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. python有序队列_Python 队列
  2. leetcode27 移除元素
  3. 西门子和阿里云要搞啥事情?| 极客头条
  4. JavaScript中的arguments对象
  5. 洪筱楠(1996-),女,对外经济贸易大学国际经济贸易学院经济学荣誉学士实验班本科生。...
  6. spring mysql 多数据源_spring框架学习【多数据源配置】
  7. HTTP协议(转自:小坦克博客)
  8. 文字旋转_如何制作抖音文字旋转视频?推荐这款超火的抖音文字动画制作神器...
  9. 过游戏保护系列-巨人游戏保护(1)过PcHunter和Od检测
  10. 安装Microsoft Office Document Image Writer
  11. 高等数学关于切线,法线,切平面,法平面的详细解释
  12. 清华、南京大学计算机系女神非常敬佩的IT公众号
  13. Java五子棋书,本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下package gyb.exam; import java.awt.Bo...
  14. “剧情+综艺” 助推国潮文化破圈
  15. 人像图片Relight
  16. 图形学 (-)数学基础
  17. Android模拟器编程,Android模拟器入门[转]
  18. 数据可视化-柱状图-dict结构MACARONS主题
  19. Java程序员的重启人生-1.初到异世界
  20. 【转】SLAM 论文阅读和分类整理

热门文章

  1. typora里插入图片,设置图片大小和位置
  2. 分布式系统如何保证数据一致性
  3. 项目开发日报表(第一天)
  4. 初测ONES项目管理工具,寻求与众不同
  5. 计算机应用基础试题答案截图,《计算机应用基础》试题二
  6. 便携式电热水壶外贸出口欧洲CE认证准备资料
  7. 【Unity】制作动画
  8. 一次惨痛的微软AA面经历
  9. 我看过的关于职业规划最好最全面的一篇文章
  10. 什么是超大附件?邮箱的超大附件怎么打开?哪个邮箱发送附件大?