P3174 [HAOI2009] 毛毛虫(树形DP)
传送门:[HAOI2009] 毛毛虫 - 洛谷
思路:
状态表示:f[i]表示以i为头部形成的毛毛虫的最大值
状态转移方程:f[u]=max(f[j])+1+max(0,cnt-1),表示子节点的最大毛毛虫加上当前节点以及那些没有在最大毛毛虫中的子节点的数量,这里没有涉及到u的父节点。所以father==-1时需要自减1,目的是让一个子节点去充当父节点的位置。
样例画图理解:
图1和图2的区别在于与1连接的2的部分摆了上去,也就是表明1实际上是只有两个子节点的,但是代码里面是从1进去的,所以才会变成图1那样有三个,所以需要1的子节点数目需要减1。
代码:
#include<iostream>
#include<cstring>
#include <cmath>
#include<algorithm>
#include <vector>
using namespace std;
const int N=3e5+10;
int n,m,ans;
int idx,e[N*2],h[N],w[N*2],ne[N*2];
int f[N];
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int father)
{int d1=0,d2=0,cnt=0;for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j==father) continue;cnt++;dfs(j,u);f[u]=max(f[u],f[j]);if(f[j]>d1) d2=d1,d1=f[j];else if(f[j]>d2) d2=f[j];}if(father==-1)cnt--; //这里的father==-1是把u当做一个没有父节点的根节点,但实际上不是的,所以要减1f[u]+=1+max(0,cnt-1);ans=max(ans,f[u]+d2);//枚举每一个点的最大和次大加起来的和
}
int main()
{cin>>n>>m;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b);add(b,a);}dfs(1,-1);//不一定非要是1进去,其他任何小于等于n的数字都可以cout<<max(ans,1)<<endl;return 0;
}
P3174 [HAOI2009] 毛毛虫(树形DP)相关推荐
- P3174 [HAOI2009]毛毛虫(树形dp)
P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...
- P3174 [HAOI2009] 毛毛虫
题意:给你一棵树,取出一根链和与链相邻的"脚":问能取出的最大节点数是多少? 分析:很容易想到:f[u] 是 u 为当前子树根节点的毛毛虫头时子树内毛毛虫最大点数.但当时其实最大的 ...
- [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的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
最新文章
- IDEA集成Docker插件实现一键自动打包部署微服务项目
- mysql中一个表最多能有几个auto_mysql--一个表上可以指定几个auto_increment
- TSQL:判定一段数组连续的数字段有多少的方案
- python的concat函数_python concat函数
- 用批处理编译*.sln工程(转)
- CSS基本知识1-CSS基本概念
- JS将指定的时间戳转为UTC时间
- 易企秀 伪静态 linux,易企秀无法预览(伪静态配置问题)!
- java常用api简单统计
- 开源WinForms界面开发框架Management Studio 选项卡文档 插件 Office 2007蓝色风格 后台线程...
- C#學習基礎------事件和索引指示器
- 机器学习回归问题解答
- 弹出消息框并且转向到上/下页
- 学习笔记:Unity战斗卡牌游戏(三)-----代码加载预设 及 Tween动画使用及播放回掉...
- Mac实用软件及功能总结
- 全!Web渗透测试:信息收集篇
- 网络教室是以多媒体计算机为核心,浅谈多媒体计算机网络教室发展趋势和方向...
- java SE复习笔记55
- linux 本地查看服务器图片-2种方式
- C语言实现动态通讯录(附带文件保存)