题目:http://acm.hdu.edu.cn/showproblem.php?pid=1213
#include<iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 1005;
int father[maxn];
int rank[maxn];
void make_set(int x){//初始化
father[x] =x;
rank[x] =0;
}
int find_set(int x){//查询
if(father[x]!= x)
father[x] = find_set(father[x]);
returnfather[x];
}
void union_set(int x,int y){//合并
x =find_set(x);
y =find_set(y);
if(x ==y)
return;
if(rank[x]>rank[y]){
father[y] = x;
}
else{
if(rank[x] == rank[y])
rank[y]++;
father[x] = y;
}
}
int count_set(int n){//计算结果
int ans =0;
intflag[maxn];
memset(flag,0,sizeof(flag));
for(int i =1;i <= n;i++){
flag[find_set(i)]++;
}
for(int i =1;i <= n;i++)
if(flag[i])
ans++;
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,a,b;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
make_set(i);
for(int i = 1;i <= m ;i++){
scanf("%d%d",&a,&b);
union_set(a,b);
}
//for(int i = 1;i <= n;i++)
// printf("%d ",father[i]);
printf("%d\n",count_set(n));
}
return0;
}