简单并查集之按秩合并——The Suspects
2015-07-27 08:48
507 查看
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
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 加入rank 来记录每个节点的秩(即树的高度),并按秩进行合并,可避免合并时的最糟糕情况,(树形为一条直线)#include<stdio.h> #include<cmath> #include<algorithm> using namespace std; #include<math.h> int rank[300005]; int f[300005]; int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } void unio(int x,int y) { int fx=find(x); int fy=find(y); if(fx==fy) return; if(rank[fx]>=rank[fy]) { f[fy]=fx; rank[fx]+=rank[fy]; } else { f[fx]=fy; rank[fy]+=rank[fx]; } } void inti(int x) { for(int i=0; i<=x; i++) { f[i]=i; rank[i]=1; } } int main() { int m,n; int k,first,second; while(scanf("%d%d",&n,&m)!=EOF) { if(n+m==0) break; inti(n); while(m--) { scanf("%d%d",&k,&first); k--; while(k--) { scanf("%d",&second); unio(first,second); } } printf("%d\n",rank[f[0]]); } }
相关文章推荐
- 导出表空间名称为V3SNS的数据后,导入数据库步骤
- 使用incrontab监控文件夹变化,执行指定命令_树莓派求助&教程_ICKey电子工程师论坛-ickey电子工程师社区
- HDOJ I Love You Too (第一周)
- 安装完hive,启动错误解决办法
- cat 显示行号http://blog.sina.com.cn/s/blog_716844910100tfxv.html
- HNOJ13312注意精度的处理问题和三角形对应的外界圆的圆心交的求法
- iOS实用技巧 - AFNetworking2安全的使用自签证书访问HTTPS
- 假期第一周周报
- 关于字体大小设置用dp还是sp
- hdoj 1013Digital Roots
- 欢迎使用CSDN-markdown编辑器
- 史上最全的程序员求职渠道总结
- bbs
- 解决目录和tgz文件等不显示相应颜色
- 基于数据库中间件Mycat的MySQL主从与读写分离配置详解与示例
- JAVA调用WebService总结
- 安卓从imageview中获得bitmap的方法
- HDOJ kiki's game (第一周)
- ThinkPHP模版引擎之变量输出详解
- 1.04-注释