zzuli 1787: 生化危机 (BFS)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_大太阳_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值