目标算法:并查集
应用范围:元素祖先判断
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30005;
int set[maxn];
int ans[maxn];
int n,m;
int num;
void init()
{
for(int i=0;i<n;i++)
set[i] = i;
}
int find(int x)
{
int r=x;
while ( set[r ] != r )
r=set[r ];
int i=x , j ;
while( i != r )
{
j = set[i];
set[i]= r ;
i=j;
}
return r ;
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
set[fx]=fy;
}
int main()
{
while(~scanf("%d%d",&n,&m) && (n+m))
{
init();
int x;
memset(ans,0,sizeof(ans));
for(int i=0;i<m;i++)
{
scanf("%d",&num);
int temp = 0;
int index = 0;
for(int j=0;j<num;j++)
{
scanf("%d",&x);
index++;
if(index == 2)
{
merge(temp,x);
index = 1;
}
temp = x;
}
}
int cnt = 1;
for(int i=1;i<n;i++)
{
if(find(0) == find(i))
{
cnt++;
}
}
printf("%d\n",cnt);
}
}