POJ - 1611
题意:n个人,m个团体,每个团体里的人是一个集合,多个团体也可能由于一些人有联系,变成了一个集合,问与0号在一个集合里的人数
思路:简单并查集,注意一下输入就行了
#include<iostream>
#include<cstdlib>
#include<map>
using namespace std;
int p[100000];
int find(int root)
{
if(root==p[root])return p[root];
else return p[root]=find(p[root]);
}
int main()
{
int n,m,i,j,x,sum,q,num,g;
while(cin>>n>>m)
{
sum=0;
if(!n&&!m)break;
for(i=0;i<n;i++)
p[i]=i;
for(i=0;i<m;i++)
{
cin>>num;
if(num!=0)
{
cin>>x;
q=find(x);
p[x]=p[find(q)];
g=p[x];
}
for(j=0;j<num-1;j++)
{
cin>>x;
if(p[find(x)]!=p[g])
p[find(x)]=p[g];
}
}
for(i=0;i<n;i++)
{
if(find(i)==find(0))sum++;
}
cout<<sum<<endl;
}
return 0;
}