记录下当前节点的儿子个数,再记下以当前节点为跟的所有子节点的深度之和。val[I]表示以i为根的所有深度和。
val[now]=val[last]-f[now]+n-f[now];
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long sint;
#define maxn 2100000
int getint()
{
char c;
int res;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int n,num;
int next[maxn],first[maxn],f[maxn],to[maxn];
sint val[maxn],f2[maxn];
void add(int a,int b)
{
num++;
to[num]=b;
next[num]=first[a];
first[a]=num;
}
void dfs(int last,int now)
{
f[now]=1;
int v;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==last) continue;
dfs(now,v);
f[now]+=f[v];
f2[now]+=f2[v];
}
f2[now]+=f[now];
}
void dfs2(int last,int now)
{
if(last==0)
{
val[now]=f2[now];
}
else
{
val[now]=val[last]-f[now]+n-f[now];
}
int v;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==last) continue;
dfs2(now,v);
}
}
int main()
{
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
u=getint();
v=getint();
add(u,v);
add(v,u);
}
dfs(0,1);
dfs2(0,1);
sint maxl=0;
for(int i=1;i<=n;i++)
{
if(val[i]>maxl)
{
maxl=val[i];
u=i;
}
}
printf("%d\n",u);
return 0;
}