The Suspects
 Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 21472 Accepted: 10393

Description

Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to separate the suspects from others.
In the Not-Spreading-Your-Sickness University (NSYSU), there are many student groups. Students in the same group intercommunicate with each other frequently, and a student may join several groups. To prevent the possible transmissions of SARS, the NSYSU collects the member lists of all student groups, and makes the following rule in their standard operation procedure (SOP).
Once a member in a group is a suspect, all members in the group are suspects.
However, they find that it is not easy to identify all the suspects when a student is recognized as a suspect. Your job is to write a program which finds all the suspects.

Input

The input file contains several cases. Each test case begins with two integers n and m in a line, where n is the number of students, and m is the number of groups. You may assume that 0 < n <= 30000 and 0 <= m <= 500. Every student is numbered by a unique integer between 0 and n−1, and initially student 0 is recognized as a suspect in all the cases. This line is followed by m member lists of the groups, one line per group. Each line begins with an integer k by itself representing the number of members in the group. Following the number of members, there are k integers representing the students in this group. All the integers in a line are separated by at least one space.
A case with n = 0 and m = 0 indicates the end of the input, and need not be processed.

Output

For each case, output the number of suspects in one line.

Sample Input

```100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0```

Sample Output

```4
1
1```

Source

并查集，经典题
并查集模板（来自北大课件）
``` int ufs[MAXN];    //并查集

void Init(int n)    //初始化
{
int i;
;i<n;i++){
ufs[i] = i;
}
}

int GetRoot(int a)    //获得a的根节点。路径压缩
{
if(ufs[a]!=a){    //没找到根节点
ufs[a] = GetRoot(ufs[a]);
}
return ufs[a];
}

void Merge(int a,int b)    //合并a和b的集合
{
ufs[GetRoot(b)] = GetRoot(a);
}

bool Query(int a,int b)    //查询a和b是否在同一集合
{
return GetRoot(a)==GetRoot(b);
}```
题意

思路
很经典的并查集的题目，找一个sum[]数组记录每一个以当前下标为根节点的集合的个体数目，最后输出0号的根节点对应的sum值，就是0号学生所在团体的人数。

代码
``` #include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 30010
int sum[MAXN];    //集合总数
int ufs[MAXN];    //并查集

void Init(int n)    //初始化
{
int i;
;i<n;i++){
ufs[i] = i;
sum[i] = ;
}
}

int GetRoot(int a)    //获得a的根节点。路径压缩
{
if(ufs[a]!=a){    //没找到根节点
ufs[a] = GetRoot(ufs[a]);
}
return ufs[a];
}

void Merge(int a,int b)    //合并a和b的集合
{
int x = GetRoot(a);
int y = GetRoot(b);
if(x!=y){
ufs[y] = x;
sum[x] += sum[y];
}
}

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
&& m==) break;
Init(n);    //初始化并查集
while(m--){    //读入m行
int t,one,two;
scanf("%d",&t);    //每一行有t个数需要输入
scanf("%d",&one);
t--;
while(t--){
scanf("%d",&two);
Merge(one,two);    //合并集合
}
}
printf()]);
}
;
}```

Freecode : www.cnblogs.com/yym2013

## poj 1611:The Suspects（并查集，经典题）的更多相关文章

1. poj 1611 The Suspects 并查集

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 30522   Accepted: 14836 De ...

2. POJ1611 The Suspects 并查集模板题

题目大意:中文题不多说了 题目思路:将每一个可能患病的人纳入同一个集合,然后遍历查找每个点,如果改点点的根节点和0号学生的根节点相同,则该点可能是病人. 模板题并没有思路上的困难,只不过在遍历时需要额 ...

3. 【转】并查集&amp;MST题集

转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...

4. POJ 1611 The Suspects （并查集）

The Suspects 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/B Description 严重急性呼吸系统综合症( S ...

5. 【HDU1231】How Many Tables（并查集基础题）

什么也不用说,并查集裸题,直接盲敲即可. #include <iostream> #include <cstring> #include <cstdlib> #in ...

6. [并查集] POJ 1611 The Suspects

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 35206   Accepted: 17097 De ...

7. poj 1611 The Suspects（并查集）

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21598   Accepted: 10461 De ...

8. POJ 1611 The Suspects（并查集，简单）

为什么ACM的题意都这么难懂,就不能说的直白点吗?还能不能好好的一起刷题了? 题意:你需要建一个n的并查集,有m个集合,最后要输出包含0的那个集合的元素的个数. 这是简单并查集应用,所以直接看代码吧! ...

9. POJ - 1182 食物链 并查集经典

思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...

## 随机推荐

1. 鸟哥私房菜学习(一)&mdash;&mdash;Linux背景了解

1.Linux,继承鱼Unix 2.Unix档案系统的两个重要概念 3.几个主要的 Linux distributions 发行者网址: • Red Hat: http://www.redhat.co ...

现在的某度查资料真的很麻烦,突然我自身的VS2015创建EF的时候找不到 ADO.NET 实体数据模型,但是使用CodeFrist是可以生成数据表的.所有特别郁闷. 打开界面如下 某度半天,都没有查出 ...

4. python基础之dict、set及字符

python基础之dict.set及字符串处理 本节内容 字典介绍及内置方法 集合介绍 字符串处理 1.字典介绍及内置方法 字典是python中唯一的映射类型,采用键值对(key-value)的形式存 ...

5. 【java基础】面向对象的三大特征---多态

java的引用变量有两种类型,编译时类型和运行时类型,如果编译时类型和运行时类型不一致,就会出现多态. 多态分为: 运行时多态 java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称 ...

6. STM32上移植ds1307笔记

PS:网上关于ds1307的资料最多还是基于51等单片机的,和stm32上还是略有差别,代码是参考了http://www.openedv.com/posts/list/20167.htm 但是他的代码 ...

7. js实现无刷新表单提交文件，将ajax请求转换为form请求方法

最近在做项目的时候遇到一个需要上传文件的需求,因为ajax请求是无法上传二进制文件流的,所以只能用form表单提交,而form提交有一个问题就是会使页面刷新,本文解决了form表单提交文件时页面刷新的 ...

8. CentOS6.5菜鸟之旅：U盘安装CentOS64位

一.前言 之前下载了个CentOS7 32位版,一下就安装成功了,但由于其目录结构等与之前的CentOS版本有很大的不同,加上教程不多不利于我这种菜鸟学习,于是决定重装CentOS6.5来学习.本篇用 ...

9. absolute绝对定位可以实现相对定位

没有设置定位值的absolute元素是个普通又不普通的元素,普通之处在于其依旧在DOM tree中,对margin等属性敏感: 不普通在于其实际的高宽都丢失了.这非常类似于浮动(float),浮动的本 ...

10. PLSQL_性能优化系列18_Oracle Explain Plan解析计划通过Baseline绑定

2015-05-28 Created By BaoXinjian