qduoj 生化危机&&ycb老师的电脑中毒了(邻接表)

本文介绍了两道算法题:一是关于生化病毒如何在城市间扩散并计算感染时间;二是关于电脑病毒如何在实验室电脑间传播并计算感染时间。两题均采用邻接表存储结构,使用队列进行广度优先搜索来确定感染顺序和所需时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://qduoj.com/problem/22/点击打开链接

生化危机

发布时间: 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天感染了城市的数量.
(注意, 每组数据第二行每个数据后边都有一个空格)

复制
2
3 1
1 2
2 3
3 2
1 2
2 3
3
1 1 1
2

题目连接:https://qduoj.com/problem/166/点击打开链接

ycb老师的电脑中毒了

发布时间: 2017年6月18日 21:38   最后更新: 2017年6月18日 21:41   时间限制: 1000ms   内存限制: 128M

spring老师开发了一个新的电脑病毒,他想试一下这个病毒的威力,于是他在ycb的电脑上植入了这个病毒,但是可怕的事情发生了,这个病毒的威力超过了spring老师的想象,开始在实验室的电脑里不断传播,最终,整个实验室的电脑都被传播了,人们都以为是ycb干的,于是让ycb老师赔偿,真是惨。

假设整个实验室一共有N台电脑, 这N台电脑是连通的, 有N-1条通道把他们连接起来.病毒会以ycb的电脑为中心,在一小时的时间内, 会把和他相连的周围的所有电脑感染. 那么, 几个小时的时间, 整个实验室的电脑都将被感染呢?

第一行输入一个T(T <= 50), 表示一共有T组测试数据.
每组数据第一行两个数n, k. n表示有n(2 <= n <= 10000)台电脑, 代表电脑1-n, k是ycb的电脑.
接下来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
邻接表储存 不然会炸内存

用set判重(可能复杂度比较高) num计数

#include <stdio.h>
#include <queue>
#include <stack>
#include <iostream>
#include <math.h>
#include <limits.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
vector<int >book[11111];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;int k;
        set< int > s;
        memset(book,0,sizeof(book));
        int over[11111];
        int num[11111];
        memset(num,0,sizeof(num));
        memset(over,0,sizeof(over));
        scanf("%d%d",&n,&k);
        for(int i=0;i<n-1;i++)
        {
            int x;int y;
            scanf("%d%d",&x,&y);
            book[x].push_back(y);
            book[y].push_back(x);
        }
        queue <int >q;
        q.push(k);
        int ii=1;
        s.insert(k);
        num[0]=1;
        while(1)
        {
            if(q.empty())
                break;
            else
            {
                int temp[11111];
                int j=0;
                while(!q.empty())
                {
                    temp[j]=q.front();
                    q.pop();
                    j++;
                }
                int sum=0;
                for(int i=0;i<j;i++)
                {
                    for(int l=0;l<book[temp[i]].size();l++)
                        if(!s.count(book[temp[i]][l]))
                        {
                            q.push(book[temp[i]][l]);
                            s.insert(book[temp[i]][l]);
                            sum++;
                        }
                }
                num[ii]=sum;
                ii++;
            }
        }
        int sum=0;
        printf("%d\n",ii-1);
        for(int i=0;i<ii-1;i++)
            printf("%d ",num[i]);
            printf("\n");
    }
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值