dfs1中的siz[u]初始值要设为1,设为0只有80pts。
siz[u]表示以u为根,所有结点的深度之和,设初值时不应该是0吗?
#include <bits/stdc++.h>
#define int long long
#define N (int)1e6+5
using namespace std;
int read()
{
char ch=getchar();int x=0,f=1;
while(ch>'9' || ch<'0'){
if(ch=='-') f=-1;ch=getchar();
}
while(ch>='0' && ch<='9')
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
void print(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
}
void space(){ putchar(' '); }
void enter(){ putchar('\n'); }
int n,cnt,u,v,ans=1,mx;
int head[N],dp[N],dep[N],siz[N];
struct Edge
{
int v,nex;
}e[N<<1];
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void dfs1(int u,int fa,int depp)
{
dep[u]=depp;siz[u]=1;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].v;
if(v==fa) continue;
dfs1(v,u,depp+1);
siz[u]+=siz[v];
}
}
void dfs2(int u,int fa)
{
if(u!=1){
dp[u]=dp[fa]+n-2*siz[u];
if(dp[u]>mx) mx=dp[u],ans=u;
}
for(int i=head[u];i;i=e[i].nex){
int v=e[i].v;
if(v==fa) continue;
dfs2(v,u);
}
}
main()
{
n=read();
for(int i=1;i<n;i++){
u=read();v=read();
add(u,v);add(v,u);
}
dfs1(1,-1,0);
//for(int i=1;i<=n;i++) dp[1]+=dep[i]/*cout<<dep[i]<<" "*/;
dp[1]=siz[1];mx=dp[1];
dfs2(1,-1);
//for(int i=1;i<=n;i++) cout<<dp[i]<<' ';
print(ans);enter();
return 0;
}