Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
解题思路:并查集的使用。具体是将每一组的元素用一个元素来代表,一般用第一个元素代表整个数组。不同组的进行合并,我是全部都合并到前面的数组中。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int father[30001],sum[30001];
void chushihua(int n)
{
for(int i=0;i<n;i++)
{
father[i] = i;
sum[i] = 1;
}
}
int fff(int z)
{
if(father[z]!=z)
father[z]=fff(father[z]);
return father[z] ;
}
void combine(int a,int b)
{
int x=fff(a);
int y=fff(b);
if(x!=y)
{
father[y]=x;
sum[x]=sum[x]+sum[y];
}
}
int main()
{
int n,m,k,a,b,i;
while(scanf("%d%d",&n,&m)==2)
{
if(n==0&&m==0)break;
chushihua(n);
while(m--)
{
scanf("%d",&k);
scanf("%d",&a);
for(i=1;i<k;i++)
{
scanf("%d",&b);
combine(a,b);
}
}
printf("%d
",sum[fff(0)]);
}
return 0;
}