Luogu P3174 [HAOI2009]毛毛虫 (树形dp)
来源: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)相关推荐
- P3174 [HAOI2009]毛毛虫(树形dp)
P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- P3174 [HAOI2009] 毛毛虫
题意:给你一棵树,取出一根链和与链相邻的"脚":问能取出的最大节点数是多少? 分析:很容易想到:f[u] 是 u 为当前子树根节点的毛毛虫头时子树内毛毛虫最大点数.但当时其实最大的 ...
- [Luogu P2014]选课 (树形DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察 ...
- UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)
UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...
- 【Luogu】P1131时态同步(树形DP)
题目链接 甚矣吾衰也!这么简单的DP我都不会了 太恐怖了 树形DP,从子树里选出时间最长的来,剩下的调到这个最长时间即可. #include<cstdio> #include<cct ...
- Luogu P1122 最大子树和 树形DP
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- 【Luogu】P2634聪聪可可(树形DP)
题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一 ...
- 0x54. 动态规划 - 树形DP(习题详解 × 12)
目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...
- [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. 输入输出格式 输入格式: 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...
最新文章
- PostgreSQL在何处处理 sql查询之四十七
- jupyter notebook即原来的Ipython notebook的使用方法
- matlab将数据输出到excel中,matlab将数据保存为excel表格-怎样将MATLAB中的数据输出到excel中...
- 2.14情人节,程序员该如何绝地反击?
- python 如何修改字典的key值_Python编程:如何把元组/字典作为参数传递给函数(附代码)...
- 酷炫的VR选座,阿里大麦背后的技术堪称豪华
- 2.3.2 EditText(输入框)详解
- nginx,作为前端的你会多少?
- web安全day18:kali下的两个实验彻底理解中间人攻击
- 电商如何做企业总体架构?
- Webservice接口之CXF框架及Axis框架
- Android 7.1 设置不支持遥控操作?
- form-group 两种常用使用
- 保研之路——上科大信息学院直硕夏令营
- WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式
- [模仿]html5游戏_兔子踩铃铛
- Java 富文本内容转化word导出
- LeetCode 974. 和可被 K 整除的子数组 | Python
- 软件加密技术和注册机制加密基础(转)
- Linux openssl 搭建CA、签名证书