记录编号 |
57202 |
评测结果 |
EEEEEEEEEE |
题目名称 |
[HAOI 2009]毛毛虫 |
最终得分 |
0 |
用户昵称 |
cstdio |
是否通过 |
未通过 |
代码语言 |
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;
}