AC了,有个小问题
查看原帖
AC了,有个小问题
794701
wo_hen_la楼主2024/4/7 22:22

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;
}
2024/4/7 22:22
加载中...