X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室.
恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天的时间内, 会把和他相连的周围的所有城市感染. 那么, 多少天的时间, 整个地球的城市都感染呢?
http://acm.zzuli.edu.cn/problem.php?id=1787
X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室.
恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天的时间内, 会把和他相连的周围的所有城市感染. 那么, 多少天的时间, 整个地球的城市都感染呢?
第一行输入一个T(T <= 50), 表示一共有T组测试数据. 每组数据第一行两个数n, k. n表示有n(2 <= n <= 10000)个城市, 代表城市1-n, k是X博士所在的城市. 接下来n-1行, 每行有两个数u, v, 表示城市u和v之间有一条通道.
每组数据第一行输出第一个数 x , 表示整个地球感染需要x天. 接下来 x 个数, 第i个数表示第i天感染了城市的数量. (注意, 每组数据第二行每个数据后边都有一个空格).
2 3 1 1 2 2 3 3 2 1 2 2 3
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; }