原创


The Suspects

Time Limit: 1000MS  Memory Limit: 20000K

Total Submissions: 48698  Accepted: 23286

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

 
此题出自POJ——1611:http://poj.org/problem?id=1611
 
题目大意:
  学校要找出患了SARS一共有多少人,n个学生人数(编号0~n-1),m个协会,每个协会有k个人,并给出这k个人的编号。
每个学生可以参加多个协会,如果一个协会里面存在1个或多个患病学生,则协会全部人都会患病,所以患病协会里面可能
存在参加多个协会的患病学生,这样会带来协会传染,学校要求求出患病人数,当然,定义编号为0的学生是首个患病学生。
  输入:第一行n(学生人数)和m(协会数),接下来m行,每行第一个数代表k,接下来k个数代表参加此协会的学生的编号,
  n==m==0时表示结束。
  输出:患病学生人数
注意:可以输入多组数据,等结束输入后再一起分行输出结果。
 
解题思路:(并查集算法具体思路不再赘述,详情查看:https://www.cnblogs.com/chiweiming/p/9310599.html
  并查集,我们把每个协会的学生的编号整合起来放在同一棵树上,若一个学生参加了多个协会,则他所参协会的多棵树会被合并起来成为一棵,这样最后只需要找出编号为0的学生所在的树的结点数就是患病学生的人数了。
  值得注意的是,代码中对寻找根节点的算法进行了优化!
  原来只是单纯的寻找某个结点所在树的根节点,并没有改变数的结构:
  return node==student[node]?node:find_Father(student[node]); 

  优化后,改变了树的结构,将结点至根节点的链上的所有结点直接指向了根节点,大大方便了下次再次搜寻的效率!

  static int find_Father(int node) {    //寻找根节点
/*
return node==student[node]?node:find_Father(student[node]);
*/ if(node!=student[node]) {
student[node]=find_Father(student[node]);
//状态压缩,将结点node到根节点这条链上的结点直接指向根节点,优化下次寻找根节点的时间
}
return student[node]; }

Java代码:

import java.util.*;

public class TheSuspects {

    static int n;    //学生数量
static int m; //组的数量
static int student[];
static int book[]; static int find_Father(int node) { //寻找根节点
/*
return node==student[node]?node:find_Father(student[node]);
*/ if(node!=student[node]) {
student[node]=find_Father(student[node]);
//状态压缩,将结点node到根节点这条链上的结点直接指向根节点,优化下次寻找根节点的时间
}
return student[node]; } public static void main(String[] args) { Scanner reader=new Scanner(System.in);
ArrayList list=new ArrayList();
int count=0; while(reader.hasNext()) { n=reader.nextInt();
m=reader.nextInt();
if(n==0 && m==0) {
break;
}
student=new int[n];
book=new int[n];
for(int i=0;i<n;i++) {
student[i]=i; //学生指向自己
book[i]=1; //每个学生为1个结点
}
for(int i=1;i<=m;i++) {
int k=reader.nextInt();
int node_One=reader.nextInt(); //输入k个结点中的第一个
for(int j=1;j<=k-1;j++) {
int node_Two=reader.nextInt();
int father_One=find_Father(node_One); //找出父节点
int father_Two=find_Father(node_Two);
if(father_One!=father_Two) {
student[father_Two]=father_One; //合并
book[father_One]+=book[father_Two]; //book[根节点]存储其所在树的结点数,每有一个学生加入此数,总结点数+1
}
}
}
list.add(book[find_Father(0)]); //求0所在树的结点个数
count++; }
for(int i=0;i<count;i++) {
System.out.println(list.get(i));
}
} }

POJ截图:

23:31:36

2018-07-18

The Suspects——Asia Kaohsiung 2003的更多相关文章

  1. [并查集] POJ 1611 The Suspects

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

  2. poj 1611:The Suspects(并查集,经典题)

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

  3. poj 1611 The Suspects(并查集)

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

  4. 【原创】poj ----- 1611 The Suspects 解题报告

    题目地址: http://poj.org/problem?id=1611 题目内容: The Suspects Time Limit: 1000MS   Memory Limit: 20000K To ...

  5. The Suspects(并查集维护根节点信息)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 37090   Accepted: 17980 De ...

  6. 并查集模板题(The Suspects )HZNU寒假集训

    The Suspects Time Limit: 1000MS Memory Limit: 20000KTotal Submissions: 36817 Accepted: 17860 Descrip ...

  7. [ACM] POJ 1611 The Suspects (并查集,输出第i个人所在集合的总人数)

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21586   Accepted: 10456 De ...

  8. poj1611---The Suspects

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 19754   Accepted: 9576 Des ...

  9. POJ----The Suspects

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 18890   Accepted: 9150 Des ...

随机推荐

  1. VS下QT的自定义槽函数修改方法

    通过几天的摸索,基本发现了两个VS的槽函数的修改方法 一种是UI是通过UI 设计师拖出来的,类似VB的方法,通过拖的方法,按钮的代码是系统自动生成的,在UI.h的头文件下,这个时候,实现槽函数有个固定 ...

  2. vs2005中microsoft ado data control 6.0控件问题

    在vs2005中是没有这个控件的,需要注册,步骤如下: 1. 先到C:\WINDOWS\system32目录下看看你的系统里是否已经有了MSADODC.ocx和MSDATGRD.ocx这两个文件(多半 ...

  3. Regex正则表达式

    正则表达式 热身 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 例如 g ...

  4. PhysicalDrive

    由于"\"是C/C+中转义符, "\\\\.\\"就相当于\\.\ 在Windows中 \\.\ 前缀用于标识设备,其中的"."表示本地计算 ...

  5. android欢迎页

    在进入程序后,会在一个页面停留几秒然后自动跳转到程序主界面,这个页面就是欢迎页. 首先新建个java文件,给他起名叫做WelcomeActivity 在里面我们通过一个匿名类new Handler,在 ...

  6. activemq安装运行及其在springboot中的queue和topic使用

    安装activemq 运行 springboot使用 依赖 配置 Producer Consumer ComsumerTopic 使用 安装activemq http://activemq.apach ...

  7. Java微信公众平台开发(十)--微信自定义菜单的创建实现

    转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...

  8. pl/sql的to_char和to_date

    今天同事让笔者将sql查询出来的时间转换为指定格式的字符串,笔者当时懵逼了,印象中记得有处理过,但就是一时想不起来了,等处理了这个问题后,笔者觉得有必要记录一下,毕竟不知道这个是很掉面子的事不是?好了 ...

  9. HTML_基础篇v2

    网站图片页面显示案例 1.需求分析 需要在浏览器中显示2张图片信息,效果如下: 2.技术分析 [图片标签]<img /> 属性: src:指图片的位置(路径) 路径的写法:绝对路径和相对路 ...

  10. consul watch

    consul watch -type key -key mhc ./key_handler.py [root@mhc consul]# cat key_handler.py #!/usr/bin/py ...