树的直径

NOIP2018 Day1t3 的20分部分分,考场上忘记了怎么写,于是score-=10  [蒟蒻]

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100005
using namespace std;

inline int read()
{
    int f=1,x=0;
    char ch=getchar();
    while(ch<'0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int n,cnt,ans;
int v[MAXN<<1],head[MAXN],nxt[MAXN<<1];
int d1[MAXN],d2[MAXN];

void add(int a,int b)
{
    v[++cnt]=b;
    nxt[cnt]=head[a];
    head[a]=cnt;
}

int dfs(int x,int fa)
{
    for(int i=head[x];i;i=nxt[i])
    {
        if(v[i]==fa) continue;
        int d=dfs(v[i],x)+1;
        if(d>d1[x])
        {
            d2[x]=d1[x];
            d1[x]=d;
        }
        else if(d>d2[x])
            d2[x]=d;
    }
    ans=max(ans,d1[x]+d2[x]);
    return d1[x];
}

int main()
{
    int i;
    int a,b,c;
    n=read();
    for(i=1;i<n;i++)
    {
        a=read();
        b=read();
        add(a,b);
        add(b,a);
    }
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

 

posted @ 2018-12-01 16:17  白驹过隙----青春绿  Views(172)  Comments(0Edit  收藏  举报