基础并查集哈
并查集就用于不相交集合上的操作,find函数寻找集合代表元素,union合并2个集合
#include<stdio.h>
#include<string.h>
int a[30010];
int fa[30010];
int p[30010];
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void uion(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fx]=fy;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2&&(n||m))
{
int i,j;
int k,x;
for(i=0;i<n;i++)
{
fa[i]=i;
p[i]=0;
}
for(i=1;i<=m;i++)
{
scanf("%d",&k);
for(j=0;j<k;j++)
{
scanf("%d",&x);
p[x]=i;
}
for(j=0;j<n;j++)
{
if(p[j]==p[x])
{
uion(j,x);
}
}
}
int count=0;
for(i=0;i<n;i++)
{
if(find(i)==find(0))
count++;
}
printf("%d\n",count);
}
return 0;
}