比赛 20120419s 评测结果 AWWWTTTTTT
题目名称 国王的遗产 最终得分 10
用户昵称 201101 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-19 11:03:04
显示代码纯文本
/*
UID:cheepok
PID:legacy
*/

#include<stdio.h>
#include<vector>
#include<list>

using namespace std;

struct orz
{int x,y;};

int n,k,a,b,c,s[2],Min[2];

bool flag[30001],bo;

vector <int> v[30001];

list <orz> e;

list <orz> :: iterator it,it1;

int min(int a,int b)
{
	return a<b?a:b;
}

void dfs(int t,int k)
{
	s[t]++;
	Min[t]=min(Min[t],k);
	for(int i=0;i<v[k].size();i++)
	{
		if(!flag[v[k][i]])
		{
			flag[v[k][i]]=true;
			dfs(t,v[k][i]);
			flag[v[k][i]]=false;
		}
	}
}

void dfs1(int k)
{
	for(int i=0;i<v[k].size();i++)
	{
		if(!flag[v[k][i]])
		{
			flag[v[k][i]]=true;
			dfs1(v[k][i]);
		}
	}
}

int main()
{
	freopen("legacy.in","r",stdin);
	freopen("legacy.out","w",stdout);
	int i;
	scanf("%d%d",&n,&k);
	for(i=1;i<n;i++)
	{
		orz tmp;
		scanf("%d%d",&tmp.x,&tmp.y);
		v[tmp.x].push_back(tmp.y);
		v[tmp.y].push_back(tmp.x);
		e.push_back(tmp);
	}
	for(i=1;i<k;i++)
	{
		a=0;b=n+1;
		for(it=e.begin();it!=e.end();it++)
		{
			s[0]=s[1]=0;
			Min[0]=Min[1]=n+1;
			flag[(*it).x]=true;
			flag[(*it).y]=true;
			dfs(0,(*it).y);
			flag[(*it).x]=false;
			flag[(*it).y]=false;
			flag[(*it).x]=true;
			flag[(*it).y]=true;
			dfs(1,(*it).x);
			flag[(*it).x]=false;
			flag[(*it).y]=false;
			if(s[0]==s[1])
			{
				if(s[0]>a)
				{
					a=s[0];
					if(Min[0]<Min[1])
					{
						b=Min[0];
						bo=true;
					}
					else
					{
						b=Min[1];
						bo=false;
					}
					it1=it;
				}
				else if(s[0]==a)
				{
					if(Min[0]<b)
					{
						b=Min[0];
						bo=true;
						it1=it;
					}
					if(Min[1]<b)
					{
						b=Min[1];
						bo=false;
						it1=it;
					}
				}
			}
			else if(s[0]<s[1])
			{
				if(s[0]>a)
				{
					a=s[0];
					b=Min[0];
					bo=true;
					it1=it;
				}
				else if(s[0]==a&&Min[0]<b)
				{
					b=Min[0];
					bo=true;
					it1=it;
				}
			}
			else
			{
				if(s[1]>a)
				{
					a=s[1];
					b=Min[1];
					bo=false;
					it1=it;
				}
				else if(s[1]==a&&Min[1]<b)
				{
					b=Min[1];
					bo=false;
					it1=it;
				}
			}
		}
		printf("%d ",a);
		n-=a;
		if(bo)
		{
			flag[(*it1).x]=true;
			flag[(*it1).y]=true;
			dfs1((*it1).y);
			flag[(*it1).x]=false;
		}
		else
		{
			flag[(*it1).x]=true;
			flag[(*it1).y]=true;
			dfs1((*it1).x);
			flag[(*it1).y]=false;
		}
		for(it=e.begin();it!=e.end();it++)
		{
			if(flag[(*it).x]||flag[(*it).y])
			{
				it1=it;
				it++;
				e.erase(it1);
			}
		}
	}
	printf("%d\n",n);
	return 0;
}