POJ 1611 The Suspects(并查集算法 路径压缩)
2013-08-10 01:33
148 查看
[align=center]The Suspects[/align]
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
Sample Output
Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 18776 | Accepted: 9080 |
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
题意: 判断有多少个病毒携带者。默认0号为病毒携带者,凡是与0号一起出现的都算病毒携带者。
思路: 并查集算法
import java.io.*; import java.util.*; /* * @author denghuilong * * 2013-8-10上午1:26:31 * */ public class Main { public static int student[]; public static int ans[]; public static void main(String[] args) { Scanner sc=new Scanner(new BufferedInputStream(System.in)); while(sc.hasNextInt()){ int n=sc.nextInt(); int m=sc.nextInt(); if(n==0&&m==0) System.exit(0); student=new int ; ans=new int ; Arrays.fill(ans,1); for(int i=0;i<n;i++) student[i]=i; for(int i=0;i<m;i++){ int k=sc.nextInt(); int p=sc.nextInt(); for(int j=0;j<k-1;j++){ int q=sc.nextInt(); union(p,q); } } System.out.println(ans[find(0)]); } } public static void union(int x,int y){ int px=find(x); int py=find(y); if(px==py) return; else{ if(px>py){ student[py]=px; ans[px]+=ans[py]; } else{ student[px]=py; ans[py]+=ans[px]; } } } public static int find(int x){ int p=student[x]; if(p==x) return p; return find(p); } }
相关文章推荐
- POJ 2524 Ubiquitous Religions(并查集算法 路径压缩)
- 基于简单的路径压缩的并查集算法
- 并查集算法和路径压缩
- MVC中用 BundleCollection 压缩CSS时图片路径问题
- hdu1074 状态压缩dp 记录路径
- 对指定文件(一个或多个)进行压缩,并存放到指定路径
- 并查集算法和路径压缩
- 并查集 路径压缩
- [算法第一轮复习] 并查集 + 路径压缩
- 【并查集+压缩路径】
- 由于使用了web url路径压缩图片导致错误
- HDU 4026【状态压缩DP+判断路径可达】
- android 根据uri获取路径及图片压缩、旋转的学习笔记
- uva 624 CD 01背包状态压缩记路径
- Codeforces 745C - Hongcow Builds A Nation 并查集乱搞,注意路径压缩
- LA3027 并查集 压缩路径+维护距离
- NYOJ 1107 最高的奖励 【贪心】+【路径压缩】
- Gulp学习指南之CSS合并、压缩与MD5命名及路径替换
- Fukuoka 2011 F - City Merger <路径压缩,位运算,AC自动机>
- 加权路径压缩并查集实现