http://poj.org/problem?id=1611
题意:给你n个人,m个团体,其中0号人患病,只要和这个人直接间接在一个团体的都患病,求最后患病人数量。
思路:并查集应用,把输入的团体成员划分为一个团体(用并查集划分并不知道祖先是谁),然后遍历寻找和0号节点祖先一样的人。
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
const int INF = 0x3f3f3f3f;
int pre[N], sum;
int Find(int x)
{
int r = x;
while(r != pre[r])
r = pre[r];
int i = x, j;
while(pre[i] != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
void Union(int p1, int p2)
{
int x = Find(p1);
int y = Find(p2);
if(x != y)
{
pre[x] = y;
}
}
int main()
{
// freopen("in.txt", "r", stdin);
int n, m, k;
while(~scanf("%d%d", &n, &m))
{
sum = 0;
if(n == 0 && m == 0) break;
for(int i = 0; i < n; i++)
pre[i] = i;
for(int i = 1; i <= m; i++)
{
scanf("%d", &k);
int num1, num;
scanf("%d", &num1);
k--;
while(k --)
{
scanf("%d", &num);
Union(num1, num);
num1 = num;
}
}
for(int i = 0; i < n; i++)
if(Find(i) == pre[0]) sum++;
printf("%d\n", sum);
}
return 0;
}