【并查集】POJ1611-The Suspects + 并查集简单理解

2023-12-15 22:39

本文主要是介绍【并查集】POJ1611-The Suspects + 并查集简单理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天讲的新东西是并查集啦~因为以前看过一个特别好理解的介绍并查集的文章,所以今天还挺能理解的。。。推荐给大家,顺便我也做个马克。。。

链接:高级数据结构设计--并查集及实现学习笔记(有趣篇) - ACShiryu - 博客园 

另外里面也有一些相关的题,可以看一看!

其实要是光把部分的代码放上去看不懂还是并没有什么卵卵用,来道相对(没错就是相对)典型的简单的题吧!

来人,上题!


【题目】


The Suspects
Time Limit: 1000MS Memory Limit: 20000K
   

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

Asia Kaohsiung 2003

【题意】

就是说一个学校有很多社团,一天0号同学感染了SARS,而且和0号同学同在一个社团的人都会被感染,被感染的同学如果参加了其它社团,那么其他同学参加的社团所有成员都会被感染,以此类推,给你这个学校的社团成员名单,问共有多少同学被感染。

输入有若干测试实例,数据以n和m都为0时结束,第一行第一个数字n是该学校参加社团同学的总人数,第二个m表示有m个社团,下面m行第一个数字表示每个社团的人数,后面表示每个社团的成员学号。

输出占一行,输出被感染同学人数。


【思路】

之所以选这道题,是因为它能较独立地展现两个(三个?)并查集里面常用的函数或者说技巧。这道题说白了主要分为以下几步:把每个社团的成员分别铁索连环起来并统计社团人数,把有同一个同学参加的几个社团铁索连环并趁机统计总人数,找到0所在的社团,找到与0联动的最顶层同学编号,这位同学此时是所有被感染的同学的头头,此时只要将这位同学所对应的人数计数器显示出来就行了,这其中对应两个函数:find():用来查找最高的同学;Union():铁索连环社团成员/各个社团;另外要加一个num[]数组来实时记录总人数。具体还是要看代码中我的注释:


【代码】

#include<cstdio>int n,m,form,latt,a[30001],num[30001];//num数组用来记录社团人数,一开始没组社团时每个人自成一队每个人对应的num都是1,当有两个人合并时将两个人对应的num加起来 
void chongzhi();
int find(int x);
void Union(int p,int q);int main()
{while(scanf("%d%d",&n,&m)&&(n||m)){chongzhi();//重置数据 for(int i=0;i<m;i++){int nn;scanf("%d",&nn);for(int j=0;j<nn;j++){if(j==0){scanf("%d",&form);continue;}scanf("%d",&latt);//输入,每行第一个数表示成员个数 Union(form,latt);}}printf("%d\n",num[find(0)]);}
}void chongzhi()
{for(int i=0;i<=n;i++){a[i]=i;num[i]=1;}
}int find(int x)
{return a[x]==x?x:a[x]=find(a[x]);//查找根节点 
}void Union(int p,int q)
{int root1=find(p);int root2=find(q);if(root1!=root2){a[root2]=root1;//此时root1是老大 num[root1]+=num[root2];//把两个社团的人数合并为一个社团 }<span style="font-family: Arial, Helvetica, sans-serif;">}</span>


BilngBilng收工啦~


这篇关于【并查集】POJ1611-The Suspects + 并查集简单理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/498158

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav