树的直径
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; }