【luogu3174】【HAOI2009】毛毛虫
Description
对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。
Input
在文本文件 worm.in 中第一行两个整数 N , M ,分别表示树中结点个数和树的边数。
接下来 M 行,每行两个整数 a, b 表示点 a 和点 b 有边连接( a, b ≤ N )。你可以假定没有一对相同的 (a, b) 会出现一次以上。
Output
在文本文件 worm.out 中写入一个整数 , 表示最大的毛毛虫的大小。
Sample Input
13 12
1 2
1 5
1 6
3 2
4 2
5 7
5 8
7 9
7 10
7 11
8 12
8 13
Sample Output
11
Hint
40% 的数据, N ≤ 50000
100% 的数据, N ≤ 300000
Solution
维护包含该点的子树内最大毛毛虫,答案统计时为子树内最大毛毛虫+次大毛毛虫的结果。时间复杂度为O(n).
Code
#include <stdio.h>
#define MN 300005
#define R register
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
#define end fclose(stdin);fclose(stdout)
inline int read(){
	R int x; R bool f; R char c;
	for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
	for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
	return f?-x:x;
}
int f[MN],ans,n,to[MN<<1],nt[MN<<1],h[MN],en,sz[MN];
inline void ins(int x,int y){to[++en]=y,nt[en]=h[x],h[x]=en;++sz[x];}
inline int max(int a,int b){return a>b?a:b;}
inline void dfs(int u,int fa){
	R int ma1=0,ma2=0;f[u]=1;
	for (R int i=h[u]; i; i=nt[i])
		if (to[i]!=fa){
			dfs(to[i],u);
			if (f[to[i]]>ma1) ma2=ma1,ma1=f[to[i]];
			else if (f[to[i]]>ma2) ma2=f[to[i]];
		}f[u]=max(f[u],ma1+sz[u]-1);ans=max(ans,ma2+ma1+sz[u]-1);
}
int main(){
	n=read(),read();
	for (R int i=1; i<n; ++i){
		R int x=read(),y=read();
		ins(x,y);ins(y,x);
	}dfs(1,0);printf("%d\n",ans);
}
【luogu3174】【HAOI2009】毛毛虫的更多相关文章
- 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 ). 输入输出格 ... 
- 【Luogu P3174 】[HAOI2009]毛毛虫
		前言: 虽然很多人和我想法一样 ,但我还是不要脸地写了这题解 题目: 链接 大意: 在一棵树上取一条最长链以及它所连接的结点总共的结点个数 思路: 取链: 用树形\(DP\)就可以轻而易举的解决这个问 ... 
- Noip前的大抱佛脚----赛前任务
		赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ... 
- NOIP前的刷题记录
		因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ... 
随机推荐
- Beta冲刺NO.3
			Beta冲刺 第三天 1. 昨天的困难 1.昨天的困难主要集中在对Ajax的使用上,不熟悉这种语法,所以也就浪费了时间,导致昨天的批量删除没有完全完成. 2.由于之前的网页构造style很乱,导致修改 ... 
- choose the max from numbers, use scanf and if else (v1:21.9.2017,v2:23.9.2017)
			#include<stdio.h> int main(){ int a,b,c,max; printf("请输入一个数值: "); scanf("%d&quo ... 
- C实现单链表
			typedef int DataType; typedef struct ListNode { DataType data; struct ListNode* next; }ListNode; //初 ... 
- Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享
			本案例中发生故障的存储类型是HP P2000,虚拟化平台为vmware exsi,共有10块硬盘组成raid5(硬盘容量为1t,其中6号盘是热备盘),由于某些故障导致阵列中两块硬盘亮黄灯掉线,硬盘无法 ... 
- SpringMVC之HandlerMapping的使用
			上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandl ... 
- JAVA_SE基础——34.static修饰成员变量
			需求:描述一下学校的学生. 特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ... 
- 使用JavaScript实现一个俄罗斯方块
			清明假期期间,闲的无聊,就做了一个小游戏玩玩,目前游戏逻辑上暂未发现bug,只不过样子稍微丑了一些-.-项目地址:https://github.com/Jiasm/tetris在线Demo:http: ... 
- 第5章 子网划分和CIDR
			第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ... 
- docker安装+测试环境的搭建---
			漏洞演练环境docker地址:http://vulhub.org/#/environments/ 环境:kali-linux-2017.2-amd64.iso 一.docker安装 1.先更新一波源: ... 
- restful架构风格设计准则(六)版本管理
			读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ... 
