生化危机
发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M
描述
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天感染了城市的数量.
(注意, 每组数据第二行每个数据后边都有一个空格)
样例输入1 复制
2
3 1
1 2
2 3
3 2
1 2
2 3
样例输出1
3
1 1 1
2
发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M
描述
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天感染了城市的数量.
(注意, 每组数据第二行每个数据后边都有一个空格)
样例输入1 复制
2
3 1
1 2
2 3
3 2
1 2
2 3
样例输出1
3
1 1 1
2
1 2
利用邻接表存储图,考虑到城市个数比较多所以使用动态数组,注意数组的初始化和各项数据的初始化
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int M = 1e4 + 5;
struct Node
{
int id;
int step;//记录感染的天数
};
vector<int> mapp[M];
queue<Node> q;
int cnt[M];//存储第几天感染了多少
int d;
bool book[M];
void bfs(int s)
{
Node temp, next;
temp.id = s;
temp.step = 1;
cnt[1] = 1;
book[s] = true;
q.push(temp);
while(q.size())
{
temp = q.front();
q.pop();
vector<int>::iterator it;
for(it=mapp[temp.id].begin();it!=mapp[temp.id].end();it++)
{
if(!book[*it])
{
book[*it] = true;
next.id = *it;
next.step = temp.step + 1;
d = max(d, next.step);
cnt[next.step]++;
q.push(next);
}
}
}
}
int main()
{
int n, k, t;
int u, v;
scanf("%d", &t);
while(t--)
{
d = -1;
memset(cnt, 0, sizeof(cnt));
memset(book, false, sizeof(book));
scanf("%d%d", &n, &k);
for(int i=1;i<=n;i++)
mapp[i].clear(); //以上均为初始化
for(int i=1;i<n;i++)
{
scanf("%d%d", &u, &v);
mapp[u].push_back(v);
mapp[v].push_back(u);
}
bfs(k);
printf("%d\n", d);
for(int i=1;i<=d;i++)
printf("%d ", cnt[i]);
printf("\n");
}
return 0;
}