前面部分,下面还有文字
#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)
{
dep[u]=dep[fa]+1;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);
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);
}
}
一下两份代码不同的点是dp[1]的值,这两个dp[1]值不一样,但都能AC。
到底哪个是正确的?
main()
{
n=read();
for(int i=1;i<n;i++){
u=read();v=read();
add(u,v);add(v,u);
}
dfs1(1,-1);
// for(int i=1;i<=n;i++) dp[1]+=dep[i];
dp[1]=siz[1];
mx=dp[1];
dfs2(1,-1);
print(ans);enter();
return 0;
}
main()
{
n=read();
for(int i=1;i<n;i++){
u=read();v=read();
add(u,v);add(v,u);
}
dfs1(1,-1);
for(int i=1;i<=n;i++) dp[1]+=dep[i];
//dp[1]=siz[1];
mx=dp[1];
dfs2(1,-1);
print(ans);enter();
return 0;
}