这里有很形象的解释:http://blog.csdn.net/liujian20150808/article/details/50848646
#include <stdio.h>//并查集
int pre[1010];
int find(int x)
{
int r=x;
while(r!=pre[r])
{
r=pre[r];
}
return r;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n ,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)//初始化
{
pre[i]=i;
}
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
}
}
int cnt=0;
for(int i=1;i<=n;i++)//求树的个数
{
if(pre[i]==i)
{
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}