记录编号 57202 评测结果 EEEEEEEEEE
题目名称 [HAOI 2009]毛毛虫 最终得分 0
用户昵称 Gravatarcstdio 是否通过 未通过
代码语言 C++ 运行时间 1.662 s
提交时间 2013-04-07 15:20:32 内存使用 22.82 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<deque>
#include<algorithm>
#include<vector>
using namespace std;
const int SIZEN=300000+1;
deque<int> c[SIZEN];//邻接表
int deg[SIZEN]={0};
int n,m;
int ans=0;
int node;
//节点下标是1~n
void read(void){
	scanf("%d%d",&n,&m);
	int i,a,b;
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		c[a].push_back(b),c[b].push_back(a);
		deg[a]++,deg[b]++;
	}
	deg[1]++;
}
int f[SIZEN]={0};
bool visit[SIZEN]={0};
void dp(int x){
	visit[x]=true;
	int i,x1=0,x2=0;
	for(i=0;i<c[x].size();i++){
		if(visit[c[x][i]]) continue;
		dp(c[x][i]);
		if(f[c[x][i]]>x1) x2=x1,x1=f[c[x][i]];
		else if(f[c[x][i]]>x2) x2=f[c[x][i]];
	}
	f[x]=x1+deg[x]-1;//-2+1
	int temp=0;
	if(deg[x]==1) f[x]=1;//叶子节点
	else if(deg[x]==2) temp=f[x];//只有一个子节点
	else temp=x1+x2+deg[x]-2;
	if(temp>ans){
		ans=temp;
		node=x;
	}
}
int main(){
	freopen("worma.in","r",stdin);
	freopen("worma.out","w",stdout);
	read();
	dp(1);
	if(node!=1) ans++;
	printf("%d\n",ans);
	return 0;
}