数据太太太水了
查看原帖
数据太太太水了
794701
wo_hen_la楼主2024/4/7 22:37

前面部分,下面还有文字

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