http://acm.zzuli.edu.cn/problem.php?id=1787
1787: 生化危机
Description
X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室.
恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天的时间内, 会把和他相连的周围的所有城市感染. 那么, 多少天的时间, 整个地球的城市都感染呢?
Input
第一行输入一个T(T <= 50), 表示一共有T组测试数据. 每组数据第一行两个数n, k. n表示有n(2 <= n <= 10000)个城市, 代表城市1-n, k是X博士所在的城市. 接下来n-1行, 每行有两个数u, v, 表示城市u和v之间有一条通道.
Output
每组数据第一行输出第一个数 x , 表示整个地球感染需要x天. 接下来 x 个数, 第i个数表示第i天感染了城市的数量. (注意, 每组数据第二行每个数据后边都有一个空格).
Sample Input
2 3 1 1 2 2 3 3 2 1 2 2 3
Sample Output
3 1 1 1 2 1 2
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <queue>
#include <stack>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define N 23110
#define INF 0x3f3f3f3f
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))
struct node
{
int x, step;
}sa, en;
struct node1
{
int u, v, next;
}edge[N];
int vis[N], head[N], ans[N], cnt, n, m, maxn;
void Init ()
{
met (ans, 0);
met (head, -1);
cnt = 0;
}
void addedge (int u, int v)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void BFS ()
{
met (vis, 0);
queue <node> que;
que.push (sa);
vis[m] = 1;
ans[1]++;
while (que.size ())
{
sa = que.front (); que.pop ();
for (int i=head[sa.x]; i!=-1; i=edge[i].next)
{
node q = (node){edge[i].v, sa.step+1};
if (!vis[q.x])
{
maxn = max (maxn, q.step);
vis[q.x] = 1;
ans[q.step]++;
que.push (q);
}
}
}
return;
}
int main ()
{
int t;
scanf ("%d", &t);
while (t--)
{
int u, v;
Init ();
maxn = -1;
scanf ("%d %d", &n, &m);
for (int i=1; i<n; i++)
{
scanf ("%d %d", &u, &v);
addedge (u, v);
addedge (v, u);
}
sa = (node){m, 1};
BFS ();
printf ("%d\n", maxn);
for (int i=1; i<=maxn; i++)
printf ("%d ", ans[i]);
puts ("");
}
return 0;
}