题目链接:http://poj.org/problem?id=1611
这道题运用了并查集的合并和找根结点,没有路径压缩。
#include<iostream>
#include<cstdio>
using namespace std;
int rankn[31000];///树的高度
int father[31000];///父亲结点
int n,m,k,t,fx,fy;
void ready()
{
for(int i=0;i<n;i++)
{
father[i]=i;
rankn[i]=1;
}
}
int find_net(int x)
{
if(x==father[x])
return x;
else
return find_net(father[x]);
}
void union_net(int x,int y)
{
fx=find_net(x);
fy=find_net(y);
if(fx!=fy)
{
rankn[fx]+=rankn[fy];
father[fy]=fx;
}
}
int main()
{
int t,s;
while(scanf("%d%d",&n,&m)==2&&n)
{
ready();
while(m--)
{
scanf("%d%d",&k,&t);
for(int i=1;i<k;i++)
{
scanf("%d",&s);
union_net(t,s);
}
}
printf("%d\n",rankn[find_net(0)]);
}
return 0;
}