题目:
题解:
和我今天做的某道题有点像?
好吧简直一样呢,就当练手啦(结果练了好久发现手残。。。与longlong元素有关(加减乘)的都要设成longlong
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define N 1000005
#define LL long long
using namespace std;
int tot,nxt[N*2],point[N],v[N*2],ans;
LL maxx,h[N],size[N];
void addline(int x,int y)
{
++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;
++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x;
}
void dfs(int x,int fa)
{
h[x]=h[fa]+1;maxx+=h[x];size[x]=1;
for (int i=point[x];i;i=nxt[i])
if (v[i]!=fa)
{
dfs(v[i],x);
size[x]+=size[v[i]];
}
}
void answer(int x,int fa,LL cost)
{
for (int i=point[x];i;i=nxt[i])
if (v[i]!=fa)
{
LL t=cost-size[v[i]]+(size[1]-size[v[i]]);
if ((t>maxx)||(t==maxx && v[i]<ans)) maxx=t,ans=v[i];
answer(v[i],x,t);
}
}
int main()
{
int n,i,z;
scanf("%d",&n);
for (i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addline(x,y);
}
dfs(1,0);ans=1;
answer(1,0,maxx);
printf("%d",ans);
}