第一次写并查集题目,这个很纯-,-
题目意思是要找出所有与0相关的数字的数目。写个集合把他们串起来就行了。首先根节点的父亲节点表示这个集合的数目,这样就不用重新开数组保存数目了。
再做几个,并查集入门。
#include<iostream>//poj1161
#include<cstdio>
#include<cstring>
using namespace std;
int N,M,K;
int pre[30005];
void UFset()
{
int i;
for(i=0;i<N;i++)
pre[i]=-1;
}
int find(int x)
{
int s;
for(s=x;pre[s]>=0;s=pre[s]);
while(s!=x)
{
int tmp=pre[x];
pre[x]=s;
x=tmp;
}
return s;
}
void Union(int R1,int R2)
{
int r1=find(R1);
int r2=find(R2);
if(r1==r2) return;//R1,R2 belong one root
if(pre[r1]>pre[r2])
{
pre[r2]+=pre[r1];
pre[r1]=r2;
}
else
{
pre[r1]+=pre[r2];
pre[r2]=r1;
}
}
int main()
{
int i,j,x;
while(scanf("%d%d",&N,&M))
{
if(N==0&&M==0) break;
UFset(); //initialization
for(j=0;j<M;j++)
{
scanf("%d",&K);
int head;
scanf("%d",&head);
for(i=1;i<K;i++)
{
scanf("%d",&x);
Union(head,x);
}
}
printf("%d\n",-pre[find(0)]);
}
return 0;
}