【并查集】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

相关文章

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

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++中,模板是实现泛型编程