记录编号 425302 评测结果 AAAAAAAAAA
题目名称 [HAOI 2009]毛毛虫 最终得分 100
用户昵称 GravatarTroywar 是否通过 通过
代码语言 C++ 运行时间 0.362 s
提交时间 2017-07-15 07:46:38 内存使用 9.75 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
const int N=300050;
inline int max(int a,int b){return a>b?a:b;}
struct edges{
    int v;edges *last;
}edge[N<<1],*head[N];int cnt;
inline void push(int u,int v){
    edge[++cnt].v=v;edge[cnt].last=head[u];
    head[u]=edge+cnt;
}
int n,m;
int f[N],g[N],son[N];
bool vis[N];
int ans;
void dp(int x){
    vis[x]=true;
    for(edges *i=head[x];i;i=i->last){
        if(!vis[i->v]){
            dp(i->v);son[x]++;
            g[x]=max(g[x],f[i->v]);
            if(g[x]>f[x])   std::swap(g[x],f[x]);
        }
    }//printf("f[%d]=%d g=%d son=%d\n",x,f[x],g[x],son[x]);
    if(son[x]==0) f[x]=1;
    else    f[x]+=son[x];
    if(g[x]) g[x]--; 
    if(x!=1) g[x]++;
    ans=max(ans,f[x]+g[x]);
    //printf("f[%d]=%d g=%d son=%d\n",x,f[x],g[x],son[x]);
}
int main(){
    freopen("worma.in","r",stdin);
    freopen("worma.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        push(u,v);push(v,u);
    }
    dp(1);
    printf("%d",ans);
}
/*
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
*/