记录编号 274752 评测结果 AAAAAAAAAA
题目名称 [Codeforces 685B] 树的重心 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 4.490 s
提交时间 2016-06-29 17:05:16 内存使用 13.67 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define N 500010
using namespace std;
ifstream cin("kayandsnowflake.in");
ofstream cout("kayandsnowflake.out");
int P[N]={0};
int son[N]={0},size[N]={0};
int n;
vector<int> G[N];
int fa[N]={0};
bool check(int u,int v)
{
	return (size[u]-size[v])*2<=size[u]&&size[son[v]]*2<=size[u];
}
void DFS1(int u)
{
	int i,v;
	size[u]=1;
	for(i=0;i<G[u].size();i++)
	{
		v=G[u][i];
		DFS1(v);
		size[u]+=size[v];
		if(size[son[u]]<size[v])son[u]=v;
	}
}
void DFS2(int u)
{
	if(size[u]==1)
	{
	    P[u]=u;
		return ;
	}
	int i,v;
	for(i=0;i<G[u].size();i++)
	{
		v=G[u][i];
		DFS2(v);
	}
	v=P[son[u]];
	while(!check(u,v))v=fa[v];
	P[u]=v;
}
void read()
{
	cin>>n;
	for(int i=2;i<=n;i++)
	{
		cin>>fa[i];
		G[fa[i]].push_back(i);
	}
}

void work()
{
	DFS1(1);
	DFS2(1);
	for(int i=1;i<=n;i++)cout<<P[i]<<endl;
}
int main()
{
	read();
	work();
	return 0;
}