【题目链接】
http://poj.org/problem?id=1611
题目意思
在一个校园里有n个同学,编号0到n-1,这些同学有m个组,现在0
好为病原体,如果有同组的人感染了病毒那么全组人要被圈禁。问你有多少人感染了;
解题思路
把同一组的人用并查集归成一个集合,当两个集合合并时把一个集合人数加到另一个,(注意只有不是同一集合时才处理)。
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 30005;
int pre[N];
int num[N];
int a[N];
int n,m;
void init() ///初始化
{
for (int i = 0; i < n; i++)
{
pre[i] = i;
num[i] = 1;
}
}
int Find (int x) ///查询
{
if (x != pre[x])
pre[x] = Find(pre[x]);
return pre[x];
}
void join(int x,int y) ///合并
{
if (pre[Find(x)] != Find(y)) ///不等时候才把一个集合人数加到另一个上。不然同集合会把人数刷0
{
num[Find(y)] += num[Find(x)];
num[Find(x)] = 0;
}
pre[Find(x)] = Find(y);
}
int main()
{
while (scanf("%d %d",&n,&m),n||m)
{
init();
int k;
for (int i = 0; i < m; i++)
{
scanf("%d",&k);
for (int j = 0; j < k ;j++)
{
scanf("%d",&a[j]);
if (j != 0)
join(a[j],a[j-1]);
}
}
printf("%d\n",num[Find(0)]);
}
return 0;
}