qduoj 生化危机

生化危机
发布时间: 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值