学了并查集后 这个就很easy啦~
#include <iostream>
using namespace std;
int m,n,first;
int father[30005],num[30005];
void makeSet(int n){
for(int 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 Begin(){
while(cin>>n>>m){
makeSet(n);
if(m==0 && n==0){ //退出
return 1;
}
else{
for(int i=0,x=0;i<m;i++){
cin>>x; //输入每组的个数
cin>>first; //输入该组的第一个数字
for(int j=1,y=0;j<x;j++){
cin>>y;
Union(first,y);
}
}
}//else
cout<<num[findSet(0)]<<endl;
}//while
}
int main(){
while(true){
if(Begin())
return 0;
}
}