来源:Luogu P3174,JZOJ #460

题目描述

对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图 111)抽出一部分就变成了右边的一个毛毛虫了(图 222)。

求最大的毛毛虫的大小。

解题思路

  • 这道题其实是树的直径的一个变形,首先显然得找到树的最长路径(树的直径),然后在节点个数上加上与该链相连的边,就可以了;
  • 这里我用的是树形dp,本蒟蒻不才,请谅解;
  • 首先得预处理出 num[i]num[i]num[i] 表示 iii 节点连接点的个数,这个在邻接表插入的时候就可以做好;
  • 对于每一个父亲节点 xxx ,找到一个子节点 yyy ,用 dis1dis1dis1 和 dis2dis2dis2 找到以 xxx 为根的最长链长度和次长链长度。那么该如何更新 dis[x]dis[x]dis[x] (dis[x]dis[x]dis[x] 表示以 xxx 为根节点的最长链(直径))呢?我们可以得出:dis[x]=max(dis[x],dis[y]+num[x]−1)dis[x]=max(dis[x],dis[y]+num[x]-1)dis[x]=max(dis[x],dis[y]+num[x]−1)
  • 有一个要注意的地方:dis[x]=1dis[x]=1dis[x]=1 (初始值)
  • 得到了最长链和次长链,ansansans 就可以更新了:ans=max(ans,dis1+dis2+num[x]−1)ans=max(ans,dis1+dis2+num[x]-1)ans=max(ans,dis1+dis2+num[x]−1) 这个相信大家都能理解了;

美妙的Code时间

注:码风清奇,不喜勿喷

#include <bits/stdc++.h>
using namespace std;
int linkk[300010],dis[300010],num[300010];
int ans=0,t=0,n,m;
struct node
{int y,next;
}e[600010];
void insert(int x,int y)
{e[++t].y=y;e[t].next=linkk[x]; linkk[x]=t;num[y]++;
}
void dfs(int x,int father)
{dis[x]=1;int dis1=0,dis2=0;for (int i=linkk[x];i;i=e[i].next){int y=e[i].y;if (y!=father){dfs(y,x);if (dis[y]>dis1)  //最长链{dis2=dis1;dis1=dis[y];}elseif (dis[y]<dis1 && dis[y]>dis2) dis2=dis[y];  //次长链dis[x]=max(dis[x],dis[y]+num[x]-1);  //更新dis}}ans=max(ans,dis1+dis2+num[x]-1);  //更新ans
}
int main()
{freopen("WORM.in","r",stdin);freopen("WORM.out","w",stdout);memset(dis,0,sizeof(dis));scanf("%d %d",&n,&m);for (int i=1;i<=m;i++){int x,y;scanf("%d %d",&x,&y);insert(x,y);  //邻接表插入insert(y,x);}dfs(1,0);printf("%d",ans);return 0;
}

Luogu P3174 [HAOI2009]毛毛虫 (树形dp)相关推荐

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

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

  2. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  3. P3174 [HAOI2009] 毛毛虫

    题意:给你一棵树,取出一根链和与链相邻的"脚":问能取出的最大节点数是多少? 分析:很容易想到:f[u] 是 u 为当前子树根节点的毛毛虫头时子树内毛毛虫最大点数.但当时其实最大的 ...

  4. [Luogu P2014]选课 (树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察 ...

  5. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  6. 【Luogu】P1131时态同步(树形DP)

    题目链接 甚矣吾衰也!这么简单的DP我都不会了 太恐怖了 树形DP,从子树里选出时间最长的来,剩下的调到这个最长时间即可. #include<cstdio> #include<cct ...

  7. Luogu P1122 最大子树和 树形DP

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  8. 【Luogu】P2634聪聪可可(树形DP)

    题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一 ...

  9. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

  10. [HAOI2009]毛毛虫

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

最新文章

  1. PostgreSQL在何处处理 sql查询之四十七
  2. jupyter notebook即原来的Ipython notebook的使用方法
  3. matlab将数据输出到excel中,matlab将数据保存为excel表格-怎样将MATLAB中的数据输出到excel中...
  4. 2.14情人节,程序员该如何绝地反击?
  5. python 如何修改字典的key值_Python编程:如何把元组/字典作为参数传递给函数(附代码)...
  6. 酷炫的VR选座,阿里大麦背后的技术堪称豪华
  7. 2.3.2 EditText(输入框)详解
  8. nginx,作为前端的你会多少?
  9. web安全day18:kali下的两个实验彻底理解中间人攻击
  10. 电商如何做企业总体架构?
  11. Webservice接口之CXF框架及Axis框架
  12. Android 7.1 设置不支持遥控操作?
  13. form-group 两种常用使用
  14. 保研之路——上科大信息学院直硕夏令营
  15. WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式
  16. [模仿]html5游戏_兔子踩铃铛
  17. Java 富文本内容转化word导出
  18. LeetCode 974. 和可被 K 整除的子数组 | Python
  19. 软件加密技术和注册机制加密基础(转)
  20. Linux openssl 搭建CA、签名证书

热门文章

  1. CDR插件开发之GMS插件003 - 编写你的第一个GMS插件
  2. sql语句动态拼接多个查询条件查询数据库
  3. 三乘三魔方教程,按步骤来肯定能搞出来
  4. 美团BERT的探索和实践
  5. 我对计算机基础的认识,我对计算机的认识
  6. java excel 打勾_如何在excel中打钩
  7. 查看电脑硬盘分区格式
  8. 如何用Python画QQ表情中的滑稽脸
  9. web前端入门到实战:HTML图像标签img和源属性src及Alt属性、宽高、对齐
  10. matlab资产配置,FOF投资的量化分析:资产配置模型