题目链接:http://poj.org/problem?id=1611
函数:void Empty()、int Find(int x)、void Union(int r1,int r2) 这三个函数,要背熟。
# include <iostream>
using namespace std;
int n, m, i, j;
int father[30005], num[30005];
void makeSet(int n)
{
for(i = 0; i < n; i++)
{
father[i] = i; //使用本身做根
num[i] = 1;
}
}
int findSet(int x)
{
if(father[x] != x) //合并后的树的根是不变的
{
father[x] = findSet(father[x]);
}
return father[x];
}
void Union(int a, int b)
{
int x = findSet(a);
int y = findSet(b);
if(x == y)
{
return;
}
if(num[x] <= num[y])
{
father[x] = y;
num[y] += num[x];
}
else
{
father[y] = x;
num[x] += num[y];
}
}
int main()
{
while(scanf("%d %d", &n, &m)!=EOF && n != 0)
{
makeSet(n);
for(i = 0; i < m; i++)
{
int count, first, b;
scanf("%d %d",&count, &first);
for(j = 1; j < count; j++)
{
scanf("%d",&b);
Union(first,b);
}
}
printf("%d\n",num[findSet(0)]);
}
return 0;
}