一道简单的并查集,其实每一种新的东西去学之前你把它的原理搞懂了才能引申,不然只会停留在最初的层次。
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
int pre;
int num;
}Tree;
Tree tree[30000];
int find(int x)
{
if(tree[x].pre==x)
{
return x;
}
return (tree[x].pre=find(tree[x].pre));
}
void make(int a,int b)
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
{
tree[f1].num+=tree[f2].num;
tree[f2].pre=f1;
}
}
int main()
{
int m,n,i,j,k,a,b;
while(scanf("%d%d",&n,&m)==2)
{
if(n==0&&m==0)
break;
for(i=0;i<n;i++)
{
tree[i].pre=i;
tree[i].num=1;
}
while(m--)
{
scanf("%d",&k);
scanf("%d",&a);
for(i=1;i<k;i++)
{
scanf("%d",&b);
make(a,b);
}
}
int t=find(0);
printf("%d\n",tree[t].num);
}
return 0;
}