The Suspects(并查集求节点数)
2015-09-19 21:46
405 查看
The Suspects
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: 28164 | Accepted: 13718 |
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 代码:
#include<stdio.h> #include<string.h> const int MAXN=30010; int pre[MAXN],num[MAXN]; int find(int x){ return pre[x]=x==pre[x]?x:find(pre[x]); } int merge(int x,int y){ int f1,f2; f1=find(x);f2=find(y); if(f1!=f2){ if(f1<f2)pre[f2]=f1,num[f1]+=num[f2]; else pre[f1]=f2,num[f2]+=num[f1]; } } int main(){ int n,m,k,a,b; while(scanf("%d%d",&n,&m),n|m){ for(int i=0;i<n;i++){ pre[i]=i; num[i]=1; } while(m--){ scanf("%d",&k); scanf("%d",&a); for(int i=1;i<k;i++){ scanf("%d",&b); merge(a,b); } } printf("%d\n",num[0]); } return 0; }
相关文章推荐
- Mac下配置OpenSSL
- System Mechanic汇编破解笔记
- Java 多线程同步的五种方法
- 剑指offer-对称的二叉树
- 安卓中常用的shape,selector,layer-list
- 根据文字内容和设定maxSize计算文字的width、height
- Centos 7.1 最小安装+更新阿里源+Xfce桌面环境
- httpd虚拟主机,压缩机制,https实现,压力测试
- struct 字节对齐详解
- 对Git的认识
- test5.10
- Linux系统启动流程
- 加密过的VCD光盘(CDFS文件系统)隐藏的视频文件如何复制到硬盘
- 按之字形顺序打印二叉树
- 11个重要的数据库设计原则
- 编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现
- HDU 2027 统计元音 map
- Unity热更新专题(八)uLua示例Demo简析及SimpleFramework工作流程
- 配置Tomcat服务
- int*p[ ]与int(*p)[ ]的区别