并查集有两种优化方法,路径压缩和按秩合并,这题我用的是按数目合并,由于是第一次写,所以难免有许多bug,好在很好调。
#include<iostream>
using namespace std;
int father[30010],n,num[30010];
void inti()
{
int i;
for(i=0;i<n;i++)
{
father[i]=i;
num[i]=1;
}
}
int find(int a)
{
if(father[a]!=a)
father[a]=find(father[a]);
return father[a];
}
int main()
{
int i,j,m,k,a,b,result;
while(cin>>n>>m&&(m||n))
{
inti();
for(i=0;i<m;i++)
{
cin>>k>>a;
for(j=1;j<k;j++)
{
cin>>b;
a=find(a); //要写在循环里面
b=find(b);
if(a!=b) //很重要,因为a==b,就不用管了。
{
if(num[a]>num[b])
{
father[b]=a;
num[a]+=num[b];
}
else
{
father[a]=b;
num[b]+=num[a];
}
}
}
}
result=num[find(0)];
cout<<result<<endl;
}
return 0;
}