【HAOI2009】【P1307】毛毛虫
感觉相比其他树归题简单多了,不过有点绕(也许是我的思路很奇怪一。一)(这是省选题啊,就算作为T1这题也太水了,HA好弱……)
原题:
对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图1)抽出一部分就变成了右边的一个毛毛虫了(图2)。

N≤300000
先搞出有根树,这回不枚举中间点了,说说我的奇怪的做法一。一
搞两个数组,一个是uf,表示包括自己在内的直系最大值,另一个是bf,表示x和x往下的兄弟中uf最大的一个
然后就是求uf和bf
uf[x]=bf[tree[x].child]+tree[x].cnum;//不用减uf最大的内个儿子,因为还有自己
如果x是叶子,也就是child[x]==0,uf[x]=1
bf[x]=max(uf[x],bf[tree[x].brother]);
因为根不一定在答案上,所以设一个全局最大值ans,求uf和bf后,ans=max(ans,uf[x]+bf[tree[x].brother]+tree[tree[x].father].cnum-(tree[x].father==1));
这里不用减去两个儿子,因为还有爹和爷,然而当tree[x].father==1(我把根设为1)的时候要-1,因为根没有爹
最后直接输出ans即可
(用全局最大值来更新答案应该是很多DP的策略)
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
struct ddd{int next,y;}e[];int LINK[],ltop=;
inline void insert(int x,int y){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;}
struct dcd{int brother,child,father, cnum;}tree[];
inline void insert_tree(int x,int y){tree[y].brother=tree[x].child;tree[x].child=y;tree[y].father=x; tree[x].cnum++;}
int n,m;
int uf[],bf[];//bf表示众多兄弟中谁最大,uf表示直系最大
int ans=;
void get_tree(int x){
for(int i=LINK[x];i;i=e[i].next)if(e[i].y!=tree[x].father){
insert_tree(x,e[i].y);
get_tree(e[i].y);
}
}
void dp_tree(int x){
if(!x) return ;
dp_tree(tree[x].brother);
if(tree[x].child){
dp_tree(tree[x].child);
uf[x]=bf[tree[x].child]+tree[x].cnum;//不用减uf最大的内个儿子,因为还有自己
}
else
uf[x]=;
bf[x]=max(uf[x],bf[tree[x].brother]);
ans=max(ans,uf[x]+bf[tree[x].brother]+tree[tree[x].father].cnum-(tree[x].father==));//不用减去两个儿子,因为还有爹和爷
}
int main(){//freopen("ddd.in","r",stdin);
memset(uf,,sizeof(uf));
memset(bf,,sizeof(bf));
cin>>n>>m;//其实m就等于n-1吧一。一
int _left,_right;
for(int i=;i<=m;i++){ _left=read(),_right=read(); insert(_left,_right),insert(_right,_left);}
get_tree();
dp_tree();
cout<<ans<<endl;
return ;
}
【HAOI2009】【P1307】毛毛虫的更多相关文章
- 【HAOI2009】毛毛虫
题面 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入 ...
- 【luogu3174】【HAOI2009】毛毛虫
Description 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. Input 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...
- P3174 [HAOI2009]毛毛虫(树形dp)
P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...
- [HAOI2009]毛毛虫(树形dp)
[HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫 ...
- [haoi2009]毛毛虫 树形dp
这道题细节处理不少,但要AC不难: 设以i节点为根节点的子树能形成的最大的毛毛虫长度为f[i],则f[i]=max(f[j])+i节点的孩子数: 答案需要f最大和次大的两个子树合并,而且若合并的位置不 ...
- [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入输出格 ...
- P3174 [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入输出格 ...
- [洛谷P3174][HAOI2009]毛毛虫
题目大意:给一棵树,求其中最大的“毛毛虫”,毛毛虫的定义是一条链上分出几条边 题解:把每个点的权值定义为它的度数减一,跑带权直径即可,最后答案加二 卡点:无 C++ Code: #include &l ...
- 洛谷 3174 [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入输出格 ...
随机推荐
- iphone获取当前磁盘信息
获取iphone磁盘总大小.已使用空间.空闲空间 [代码]悦德财富:https://www.yuedecaifu.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 端口占用问题——netstat命令
1.查看所有的端口占用情况 C:\>netstat -ano 协议 本地地址 外部地址 状态 PID(进程号) TCP 127.0.0.1:1434 ...
- [UIImage resizableImageWithCapInsets:]使用注意
转自:http://www.cnblogs.com/scorpiozj/p/3302270.html 最近在sae上搭建了个wp,因为深感自己前端的东西缺乏,所以想依次为契机,学习一下.本文是从个人的 ...
- ajax 请求超过了5s 还没有返回 的话 就自动取消
ajax请求时有个参数可以借鉴一下 var ajaxTimeOut = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : ' ...
- 《view programming guide for iOS 》之可以使用动画效果的属性
frame—Use this to animate position and size changes for the view. ,框架,可以视图动态改变大小和位置 bounds—Use this ...
- 实现:TextView自由复制功能
源代码已经上传,链接地址:http://download.csdn.net/detail/huangyabin001/7556825 点击打开链接 package com.example.copyfr ...
- Python 类的一些BIF
issubclass issubclass(cls, class_or_tuple, /) Return whether 'cls' is a derived from another class o ...
- JSOI球形空间产生器 (高斯消元)
按照朴素的列方程,可以列出n+1个n元2次方程. 将相邻的两个方程相减就可以得到n个n元1次方程,进行高斯消元就可以了. ..,..] of extended; temp,ans:..] of ext ...
- 【转】Polymer API开发指南 (一)(翻译)
原文转自:http://segmentfault.com/blog/windwhinny/1190000000592324 翻译的不好,轻拍 Polymer是google的一款前端开发框架,其基于Sh ...
- Unity3d Shader
Unity3d Shader 预览Surface Shader主要用来实现光照相关处理,可能更简洁. Vertex and Fragment Shader 如果不与光照交互, 则可以用这个shader ...