博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hzwer模拟赛 感冒病毒
阅读量:5174 次
发布时间:2019-06-13

本文共 1566 字,大约阅读时间需要 5 分钟。

题目描述 
Description

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

输入描述 
Input Description

输入的第一行是两个整数n和m,表示学生的数目和社团的数目,学生的编号为0到n-1。

接下来m行,每行首先是一个数ki,表示这个社团有ki个人,接下来ki个整数,表示这个社团里每个学生的编号aij。

 

输出描述 
Output Description

输出为一行,包含一个整数。表示感染感冒病毒的人数。

 

样例输入 
Sample Input

100 4

2 1 10

5 10 13 11 12 14

2 0 1

2 9 2

 

样例输出 
Sample Output

7

 

数据范围及提示 
Data Size & Hint

对于100%的数据,3<=n<=30000

     对于100%的数据,3<=m<=500

对于100%的数据,1<=ki<=n

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

/*在合并的时候需要注意一下,社团和社团是通过人来连接的,所以要把社团所在集合的代表元素设为人*/#include
#include
#include
#include
#include
using namespace std;const int maxn = 60500;int n,m,f[maxn];int u,v,ru,rv,k;bool vis[maxn];int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){
if(ch=='-')f=-1;ch=getchar();}; while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}; return x*f;}int findf(int x){ return x == f[x] ? x : f[x] = findf(f[x]);}int main(){ n = read(); m = read(); for(int i = 0;i <= n+m;i++) f[i] = i; vis[0] = true; for(int i = 1;i <= m;i++){ k = read(); for(int j = 1;j <= k;j++){ u = read(); v = n + i; u = findf(u); v = findf(v); if(vis[v]) vis[u] = true; f[v] = u; } } int ans = 0; for(int i = 0;i < n;i++) if(vis[findf(i)]) ans++; cout<

 

转载于:https://www.cnblogs.com/hyfer/p/5893161.html

你可能感兴趣的文章
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
AI自主决策——有限状态机
查看>>
《http权威指南》阅读笔记(二)
查看>>
软件工程
查看>>
http协议
查看>>
js替换问题replace和replaceAll
查看>>
c++11 : range-based for loop
查看>>
中国农历2013,2014 (zz.IS2120@BG57IV3)
查看>>
用virtualenv建立独立虚拟环境 批量导入模块信息
查看>>
Sublime Text3 插件:convertToUTF8
查看>>
BZOJ4060 : [Cerc2012]Word equations
查看>>
hdu2089不要62(数位dp)
查看>>
JAVA输出最大值和最小值
查看>>
64位weblogic11g安装
查看>>
oracle、mysql、sql server等;流行数据库的链接驱动配置
查看>>
UvaLive 6664 Clock Hands
查看>>
PCB 周期计算采用 SQL 函数调用.net Dll 标量函数 实现
查看>>
Problem B: 取石子
查看>>