【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1131
【呆马】
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
const int N=1e6+1;
using namespace std;
struct st{int to,next;} e[N<<1];
int n,i,x,y,ans,cnt,siz[N],fi[N];
long long f[N],g[N];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=fi[x]; fi[x]=cnt;
e[++cnt].to=x; e[cnt].next=fi[y]; fi[y]=cnt;
}
void dp1(int x,int fa)
{
siz[x]=1;
for (int y,i=fi[x];i;i=e[i].next)
if (e[i].to!=fa)
{
dp1(y=e[i].to,x);
f[x]+=f[y]+siz[y];
siz[x]+=siz[y];
}
}
void dp2(int x,int fa)
{
if (x!=1) g[x]=g[fa]+n+f[fa]-f[x]-siz[x]-siz[x];
for (int i=fi[x];i;i=e[i].next)
if (e[i].to!=fa) dp2(e[i].to,x);
}
int main()
{
scanf("%d\n",&n);
for (i=1;i<n;i++)
{
scanf("%d%d\n",&x,&y);
add(x,y);
}
dp1(1,0);
dp2(1,0);
for (i=1;i<=n;i++)
if (f[i]+g[i]>f[ans]+g[ans]) ans=i;
printf("%d",ans);
}