The Suspects POJ - 1611 (并查集)

The Suspects POJ - 1611

不知从何时起,猫(Cat)已经开始成为一类校园新型毒品. 无数少女少男深受其害,一天不吸,浑身难受. 而就在最近,这种生物竟开始携带一种传染性极强的流行性病毒 —— 喵病毒 (Meow Viruses). 凡是接触猫的人,都极有可能感染喵病毒. 而我们一般称那些感染喵病毒的人,犯了喵病. 喵病的发病症状十分邪魔. 初期为连续性地疯狂撸猫,晚期甚至半夜爬上房顶学猫叫! 而由于喵病毒传染性极强,它已逐渐被认为是一种全球性的威胁. 为了减少传播给别人的机会, 最好的策略就是隔离可能的患者.
在Mr.蒟蒻的大学中,有许多学生团体. 同一个团体的学生经常彼此相通,一个学生可以同时加入几个团体. 为了防止喵病毒的传播,学校收集了所有学生团体的成员名单. 应对措施如下:

一旦一个团体中有一个患者,该团内的所有的成员就都可能是患者. 为了遏制这种病毒的传播,我们需要找到所有可能的患者. 现在已知编号为0的孟同学(感染源)已经犯了喵病,请你设计程序,找出所有可能的患者!

Input

输入文件包含多组数据,对于每组测试数据:
第一行依次为两个整数N和M, 其中N是学生的数量, M是学生团体的数量.
0 < N <=30000,0 <= M <= 500。
每个学生编号是一个0到N - 1之间的整数,一开始只有0号的孟同学被视为患者.
紧随的每一行是每一个团体的成员列表. 每行有一个整数K,代表成员数量. 之后有K个整数代表这个团体的学生. 一行中的所有整数由至少一个空格隔开. N = M = 0表示输入结束,不需要处理.

Output

对于每组测试数据, 一行输出一个正整数,即可能的患者数量。

Examples

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

题解:

这是一类常见的并查集题目, 注意rak中保存的是第i个集合的高度, 并不是第i个集合的元素数量, 想查找数量时要么再定义一个数组, 要么在结果出一遍查询即可
注意, 能写findr(par[i])的情况不要写par[i]

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const LL maxn = 30010;

int n, m;
int par[maxn], rak[maxn];
void init(){
    for(int i = 0; i <= n; i++)
        par[i] = i, rak[i] = 0;;
}
int findr(int x){
    if(par[x] == x) return x;
    else return par[x] = findr(par[x]);
}
bool isSame(int x, int y){
    return findr(x)==findr(y);
}
void unite(int x, int y){
    x = findr(x), y = findr(y);
    if(x == y) return;
    if(rak[x] < rak[y])
        par[x] = y;
    else{
        par[y] = x;
        if(rak[x]==rak[y]) rak[x]++;
    }
}
int main()
{
    while(cin >> n >> m, n+m){
        init();
        int k, p1, p2;
        for(int i = 1; i <= m; i++){
            cin >> k >> p1;
            for(int j = 2; j <= k; j++){
                cin >> p2;
                unite(p1, p2);
            }
        }
        int ans = 1;
        for(int i = 1; i <= n; i++)
            if(findr(par[i])==par[0] ) ans++;
        cout << ans << endl;
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/87911638