POJ1611 The Suspects(并查集)

来源:互联网 发布:加内特体检数据 编辑:程序博客网 时间:2024/06/18 04:55

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

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

题意:有N个人分成M组,编号从0到N-1。称呼可能患有病的人为嫌疑犯,只要一组里面有一个嫌疑犯,那么全组都是。现在为了预防病的传染,需要判断有多少个嫌疑犯。我们已经知道编号为0的人是嫌疑犯 且 一个人可能分属不同的几个组。

思路:合并每一组里面的人 + 从头查询, 并查集模版题。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;#define MAXN 30int pre[30030];int sum[30010];int find(int x){    int r = x;      //用r来传递信息    while(pre[r] != r)  //如果r的上级bushir自身        r = pre[r];     //r就接着找上级,直到找到老大    return r;           //告诉你x的老大是谁}void join(int x, int y)     //x,y成为朋友,于是他们两个的联盟合并了{    int fx = find(x);       //找x的老大    int fy = find(y);       //找y的老大    if(fx != fy){        pre[fx] = fy;       //x的老大成了y老大的小弟        sum[fy] += sum[fx];    }}int main(){    int n, m, i, j, num[30010];    while(cin >> n >> m&&( n||m))    {        for(j=0; j<n; j++){            pre[j] = j;            sum[j] = 1;        }        while(m--)        {            int a;            cin >> a;            for(i=0; i<a; i++){                cin >> num[i];            }            for(i=0; i<a-1; i++){                join(num[i], num[i+1]);            }        }        int t = find(0);        cout << sum[t] << endl;    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五十岁的女人用什么护肤品 三十岁的女人用什么护肤品好 女人用什么护肤品好 中年女人用什么护肤品 中年女性护肤品推荐 五十岁用什么牌子护肤品 女人用什么化妆品对皮肤好 四十女人用什么护肤品好 女人用什么洗发水好 适合30岁女人用的平价护肤品 20多岁的女人用什么护肤品好 适合40岁女人用的护肤品 四十岁女人适合什么护肤品 30岁的女人适合用什么护肤品 适合30岁女性的护肤品 40多岁的女人用什么护肤品 五十岁适合什么化妆品 适合50岁女性的护肤品 适合30岁女性护肤品 四十岁的女人适合什么护肤品 适合40岁女人的化妆品 女人用什么化妆品好 四十岁的女人适合什么化妆品 年轻女性护肤品 适合40岁女性的护肤品 30岁女人用什么护肤品 30多岁的女人用什么护肤品 女人不用护肤品可以吗 适合五十岁女人的化妆品 女人的护肤品 30岁女人用什么牌子护肤品 50岁女人用什么护肤品 女人的化妆品 适合中年女人的化妆品 女人化妆品有哪些 四十岁女人护肤品推荐 适合50岁女人的化妆品 女性护肤品品牌 三十岁女人化妆品 什么化妆品适合30岁的女人 什么是护肤品