比赛 20100419 评测结果 WWWWE
题目名称 烟花的寿命 最终得分 0
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-04-19 09:23:01
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>

using namespace std;
const int maxn=1000+1;
const int oo=2000000000;


struct edge
{
	int t;
	edge *op,*next;
}E[maxn],*V[maxn],*p[maxn];
int eh;
void addedge(int a,int b)
{
	E[++eh].next=V[a]; V[a]=E+eh; V[a]->t=b;
	E[++eh].next=V[b]; V[b]=E+eh; V[b]->t=a;
	V[a]->op=V[b]; V[b]->op=V[a];
}

int n;

void init()
{
	scanf("%d",&n);
	eh=0;
	memset(E,0,sizeof(E));
	memset(V,0,sizeof(V));
	int a,b;
	for (int i=1;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		addedge(a,b);
	}
}

int d[maxn],q[10*maxn];
int qt,qw;
bool inq[maxn];
void spfa(int S)
{
	memset(p,0,sizeof(p));
	qw=-1;qt=0;
	for (int i=1;i<=n;i++)
	{
		if (i!=S) d[i]=oo;
		else d[i]=0;
	}
	q[++qw]=S;inq[S]=true;
	while (qt<=qw)
	{
		int u=q[qt];
		for (edge *e=V[u];e;e=e->next)
		{
			int v=e->t;
			if (d[v]>d[u]+1)
			{
				d[v]=d[u]+1;
				p[v]=e;
				if (!inq[v])
				{
					q[++qw]=v;
					inq[v]=true;
				}
			}
		}
		inq[q[qt++]]=false;
	}
}

void print(int i)
{
	if (p[i]) print(p[i]->op->t);
	printf("%d\n",i);
}

void solve()
{
	spfa(1);
	int max=0,maxj;
	for (int i=1;i<=n;i++) if (d[i]>max && d[i]!=oo) 
	{	
		max=d[i];
		maxj=i;
	}
	spfa(maxj);
	max=0;maxj=0;
	for (int i=1;i<=n;i++) if (d[i]>max && d[i]!=oo) 
	{	
		max=d[i];
		maxj=i;
	}
	printf("%d\n",max);
	print(maxj);
}

int main()
{
	freopen("firework.in","r",stdin);
	freopen("firework.out","w",stdout);
	int T;
	scanf("%d",&T);
	for (int i=1;i<=T;i++)
	{
		init();
		solve();
	}
	return 0;
}