CF708C Centroids

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=400500;
bool jud[M];
int n,rt,f[M];
int siz[M],msz,poi,mkz;
vector<int>v[M];
inline int read()
{
    int x=0;char ch=getchar();
    while (ch>'9'||ch<'0') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x;
}
inline void add(int a,int b){return (void)(v[a].push_back(b);v[b].push_back(a));}
inline void dfs(int x,int fa)
{
	siz[x]=1;f[x]=fa;int fl=1;
	for (int i=0;i<v[x].size();i++)
	{
		int go=v[x][i];
		if (go==fa) continue;
		dfs(go,x);siz[x]+=siz[go];
		if (siz[go]>n/2) fl=0;
	}
	if (fl&&siz[x]>(n-1)/2) rt=x;
	return ;
}
inline void then(int x)
{
	for (int i=0;i<v[x].size();i++)
	{
		int go=v[x][i];
		if (siz[go]>msz) msz=siz[go],poi=go;
	}
	for (int i=0;i<v[x].size();i++)
	{
		int go=v[x][i];
		if (siz[go]>mkz&&go!=poi) mkz=siz[go];
	}
	return ;
}
inline void get(int x,int fl)
{
	if (x==poi) fl=1;
	if (fl) siz[x]+=mkz;
	else siz[x]+=msz;
	if (siz[x]>(n-1)/2) jud[x]=1;
	if (fl&&msz*2==n) jud[x]=1;
	for (int i=0;i<v[x].size();i++)
	{
		int go=v[x][i];
		if (go==f[x]) continue;
		get(go,fl);
	}
	return ;
}
int main()
{
	n=read();int a,b;
	for (int i=1;i<n;i++)
	a=read(),b=read(),add(a,b);
	dfs(1,0);
	if (rt!=1) memset(siz,0,sizeof(siz)),dfs(rt,0);
	then(rt);get(rt,0);	
	for (int i=1;i<=n;i++)
		printf("%d ",(int)(jud[i]));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81071005