深基书上的代码,60pts求调
查看原帖
深基书上的代码,60pts求调
1656441
The_Cold_Dream楼主2025/7/13 20:23

我知道我很呆。。。

代码如下

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000010;
int inf=0x7f7f7f7f;
int f[N],size[N],head[N],dep[N];
int n,centre,sum=0;//centre为重心
vector<int>G[N];
queue<int>q;
void getcentre(int u,int fa)
{
	size[u]=1;
	f[u]=0;
	for(int i=0; i<G[u].size(); i++)
	{
		int v=G[u][i];
		if(v==fa)
			continue;
		getcentre(v,u);
		size[u]+=size[v];
		f[u]=max(f[u],size[v]);
		f[u]=max(f[u],n-size[u]);
		if(f[u]<f[centre]||(f[u]==f[centre]&&u<centre))
			centre=u; 
	}
}
void bfs()
{
	q.push(centre);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<G[u].size();i++)
		{
			int v=G[u][i];
			if(dep[v]||v==centre)
				continue;
			dep[v]=dep[u]+1;
			sum+=dep[v];
			q.push(v);
		}
	}
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%lld%lld",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	centre=0;f[0]=inf;
	getcentre(1,0);
	bfs();
	printf("%lld %lld",centre,sum);
	return 0;
}

提交记录

2025/7/13 20:23
加载中...