比赛 |
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;
}