模拟赛 感冒病毒(时间限制:1s;空间限制:256MB)

通过深度优先搜索算法模拟一种感冒病毒在学校中的传播过程。该算法基于输入的学生社团成员关系,计算从0号学生开始感染后的总感染人数。

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

题目描述

一种感冒病毒正在学校里传播,这所学校有n个学生,m个学生社团,每个学生可能参加了多个社团,因为同一个社团的学生交流较多,所以如果一个学生感染上感冒病毒,那么他所在的社团里的所有学生都会感染上感冒病毒,现在已知0号学生感染上感冒病毒,问现在有多少人会感染上感冒病毒。

输入

输入文件:suspects.in
输入的第一行是两个整数n和m,表示学生的数目和社团的数目,学生的编号为0到n-1。
接下来m行,每行首先是一个数ki,表示这个社团有ki个人,接下来ki个整数,表示这个社团里每个学生的编号aij。

输出

输出文件:suspects.out
输出为一行,包含一个整数。表示感染感冒病毒的人数。

输入样例

100 4
2 1 10
5 10 13 11 12 14
2 0 1
2 9 2

输出样例

7

数据范围

对于100%的数据,3<=n<=30000
对于100%的数据,3<=m<=500
对于100%的数据,1<=ki<=n

对于100%的数据,0<=aij<n。

题解

正解其实是并查集啦,但是应为空间太大了。所以以下只是我在“不用白不用”的想法支配下写的。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define inf 1<<30
using namespace std;
int n,m,s[502],a[30002];
int zz,head[30002];
struct bian{int to,nx;} e[15000002];
int pd[30002],ans;
void insert(int x,int y)
{
	zz++; e[zz].to=y; e[zz].nx=head[x]; head[x]=zz;
	zz++; e[zz].to=x; e[zz].nx=head[y]; head[y]=zz;
}
void init()
{
	scanf("%d%d",&n,&m);
	int i,j;
	for(i=1;i<=m;i++)
	   {scanf("%d",&s[i]);
	    for(j=1;j<=s[i];j++)
	       {scanf("%d",&a[j]);
		    if(j>1) insert(a[j-1],a[j]);
		   }
	   }
}
void dfs(int x)
{
	if(pd[x]) return ;
	pd[x]=1; ans++;
	int i;
	for(i=head[x];i;i=e[i].nx) dfs(e[i].to);
}
int main()
{
	freopen("suspects.in","r",stdin);
	freopen("suspects.out","w",stdout);
	init(); dfs(0);
	printf("%d\n",ans);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值