一道简单的并查集
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int fa[333333],n,m;
int find(int x)
{
if(fa[x]==x)
return x;
return find(fa[x]);
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fx]=fy;
}
int main()
{
int i,j,k,k1,k2;
while(cin>>n>>m)
{
if(n==0)
break;
for(i=0;i<n;i++)
fa[i]=i;
for(i=0;i<m;i++)
{
cin>>k>>k1;
for(j=1;j<k;j++)
{
cin>>k2;
join(k1,k2);
k1=k2;
}
}
int cnt=0;
for(i=0;i<n;i++)
{
k1=find(0);k2=find(i);
if(k1==k2)
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}