ans数组要用long long.
/* I will wait for you */
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<string>
#define make make_pair
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int maxn=2000010;
const int maxm=1010;
const int maxs=26;
const int INF=1<<29;
const int P=1000000007;
const double error=1e-9;
struct edge{ int v,next; }e[maxn];
int n,cnt=0,fin=0,head[maxn],si[maxn],de[maxn];LL ans[maxn];
void add(int u,int v)
{
e[cnt]=(edge){v,head[u]};head[u]=cnt++;
e[cnt]=(edge){u,head[v]};head[v]=cnt++;
}
void dfs1(int u,int p)
{
de[u]=p?de[p]+1:0;si[u]=1;ans[u]=de[u];
for(int i=head[u],v;i!=-1;i=e[i].next)
if((v=e[i].v)!=p) dfs1(v,u),si[u]+=si[v],ans[u]+=ans[v];
}
void dfs2(int u,int p)
{
ans[u]=p?ans[p]+n-2*si[u]:ans[u];
for(int i=head[u],v;i!=-1;i=e[i].next)
if((v=e[i].v)!=p) dfs2(v,u);
}
int main()
{
scanf("%d",&n);memset(head,-1,sizeof(head));
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),add(u,v);
dfs1(1,0);dfs2(1,0);
for(int i=1;i<=n;i++) if(ans[i]>ans[fin]) fin=i;
printf("%d\n",fin);
return 0;
}
867

被折叠的 条评论
为什么被折叠?



