The Suspects

Time Limit:1000MS     Memory Limit:20000KB     64bit IO Format:%lld & %llu

Description

严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。
在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下:
一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。
然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。

Input

输入文件包含多组数据。
对于每组测试数据:
第一行为两个整数n和m, 其中n是学生的数量, m是团体的数量。0 < n <= 30000,0 <= m <= 500。
每个学生编号是一个0到n-1之间的整数,一开始只有0号学生被视为可能的患者。
紧随其后的是团体的成员列表,每组一行。
每一行有一个整数k,代表成员数量。之后,有k个整数代表这个群体的学生。一行中的所有整数由至少一个空格隔开。
n = m = 0表示输入结束,不需要处理。

Output

对于每组测试数据, 输出一行可能的患者。

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

复制一段网上看的并查集讲解

并查集学习:

l         并查集:(union-find sets)

一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。

l         并查集的精髓(即它的三种操作,结合实现代码模板进行理解):

1、Make_Set(x) 把每一个元素初始化为一个集合

初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。

2、Find_Set(x) 查找一个元素所在的集合

查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。
判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。
合并两个集合,也是使一个集合的祖先成为另一个集合的祖先,具体见示意图

3、Union(x,y) 合并x,y所在的两个集合

合并两个不相交集合操作很简单:
利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。如图

l         并查集的优化

1、Find_Set(x)时 路径压缩
寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?
答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示;可见,路径压缩方便了以后的查找。

2、Union(x,y)时 按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。


第一次做并查集网上看了很多 学习了其中一个dalao的风格 写的很清晰 仰望高端玩家.jpg
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;const int maxn=30005;int father[maxn],rank[maxn];
int n,m;void init(int x)
{for(int i=0;i<n;i++){father[i]=i;rank[i]=1;}
}int Find(int x)
{if(x!=father[x]){father[x]=Find(father[x]);}return father[x];
}void Union(int x,int y)
{x=Find(x);y=Find(y);if(x==y)return ;if(rank[x]>=rank[y]){father[y]=x;rank[x]=rank[x]+rank[y];}else{father[x]=y;rank[y]=rank[x]+rank[y];}}int main()
{//freopen("input.txt","r",stdin);while(~scanf("%d%d",&n,&m)){if((n==0&&m==0))break;init(n);int fir,k,next;for(int i=1;i<=m;i++){scanf("%d%d",&k,&fir);for(int i=2;i<=k;i++){scanf("%d",&next);Union(fir,next);}}printf("%d\n",rank[father[0]]);}
}

  

转载于:https://www.cnblogs.com/Hyouka/p/5709333.html

POJ 1611 The Suspects 并查集相关推荐

  1. pku 1611 The Suspects 并查集的应用

    http://poj.org/problem?id=1611 思路:统计出和0能够联系在一起的点,然后输出其个数 View Code #include <cstdio>#include & ...

  2. POJ 1611 The Suspects (并查集)

    文章作者:ktyanny 文章来源:ktyanny 转载请注明,谢谢合作. ktyanny:a的第一道并查集. 题目描述: 有很多组学生,在同一个组的学生经常会接触,也会有新的同学的加入.但是SARS ...

  3. POJ 1611 The Suspects (并查集)

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

  4. poj 1611 The Suspects // hoj 1564 The Suspects 并查集

    /* 题目: 是说学生0怀疑有SARS病,跟他接触过的俱乐部的所有人以及他接触过的人再与别人接触, 都有可能有SARS病,要你求出给出的所有俱乐部人的名单,要你求出所有的嫌疑犯... 分析: 用并查集 ...

  5. Poj 1611 The Suspects

    Poj 1611 的传送门 ***The Suspects*** Description Severe acute respiratory syndrome (SARS), an atypical p ...

  6. POJ - 1611 The Suspects

    题目链接:1611 -- The Suspects 问题描述 思路 简单并查集 代码 #include <cstdio> #include <cstring> #include ...

  7. POJ 2236 Wireless Network 并查集

    Wireless Network 并查集 Crawling in process... Crawling failed Time Limit:10000MS     Memory Limit:6553 ...

  8. POJ 1182 食物链,并查集的拓展

    http://poj.org/problem?id=1182 /******************************************************** 此道题目 前天看的时候 ...

  9. POJ 1417 True Liars 并查集+背包

    题目链接:http://poj.org/problem?id=1417 解题思路:比较容易想到的是并查集,然后把第三组数据测试一下之后发现这并不是简单的并查集,而是需要合并之后然后判断的.并且鉴于题目 ...

最新文章

  1. 人机融合智能:人工智能3.0
  2. 测试tcp连接数工具_后端开发程序员不知道压力测试怎么能行
  3. 项目服务路由保存不成功_汽车延保服务有哪些项目?不了解的小伙伴快看过来...
  4. Python爬虫框架Scrapy 学习笔记 6 ------- 基本命令
  5. class.getResourceAsStream与class.getClassLoader().getResourceAsStream区别
  6. 离线安装 Pytorch 1.2.0 torchvision 0.3.0
  7. asp 不能读取mysql 长文本文件,从文本文件中读取信息并存储入数据库_asp技巧
  8. AcWing 866. 试除法判定质数(素数判定)
  9. android 电影院订票系统 论文,基于Android平台的电影票订票系统的设计与实现
  10. matlabRC电路实验仿真
  11. C#初始化结构体数组方式
  12. 赚大钱,你需要多一些杠杆思维
  13. java strlen_字符串长度函数strlen和mb_strlen的区别示例介绍
  14. Arduino:数码管显示原理详解和Proteus仿真实验
  15. SpringBoot vue电影购票系统 电影院系统
  16. 离职当天,删库跑路,京东到家程序员被判刑
  17. 12 图浅析人口分布对经济趋势的影响
  18. Linux 基础操作、常用shell命令、vi常用命令、man帮助手册
  19. html登录号如何显示用户名,HTML更改登录标签,登录后用户名
  20. 数学推理相关的几个名词及LaTeX用法

热门文章

  1. 文心一言 VS 讯飞星火 VS chatgpt (27)-- 算法导论5.1 2题
  2. 基于FastDfs的分布式文件存储系统设计
  3. AMBA5 AHB协议规范(AHB5,AHB-Lite)中文版-第二章 信号描述
  4. 关于电阻为什么能阻碍电流流动(微观解释)
  5. 风格迁移 图像合成 图像重构 更换姿态和图像背景(使用交叉注意控制进行提示到图像编辑)GAN网络增强版
  6. 一个Unity高人的博客,涉猎范围很广,深度也很深。
  7. 系统环境变量和用户环境变量的区别
  8. Java AWT 布局管理器
  9. arm64以及amd64和龙芯4000下安装pyqt:
  10. 高数下|级数1|手写笔记