HUD.1213 How Many Tables(并查集 )
题意分析
合并的时候记录一下集合数量,最后输出。
代码总览
#include <bits/stdc++.h>
#define nmax 1005
using namespace std;
int n,m,t,num;
int father[nmax];
int rnk[nmax];
void makeset(int x){
father[x] =x;
rnk[x] = 0;
}
int findset(int x){
int rt = x,temp;
while(father[rt] != rt) rt = father[rt];
while(x!=rt){
temp = father[x];
father[x] = rt;
x = temp;
}
return rt;
}
void unionset(int x, int y){
x = findset(x);
y = findset(y);
if(x == y) return;
else{
num--;
if(rnk[x] > rnk[y]) father[y] =x;
else{
father[x] = y;
if(rnk[x] == rnk[y]) rnk[x] ++;
}
}
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
for(int i =1;i<=n;++i) makeset(i);
num = n;
for(int i = 0;i<m;++i){
int x ,y;
scanf("%d %d",&x,&y);
unionset(x,y);
}
printf("%d\n",num);
}
return 0;
}