题目链接:HDU1213
裸题,直接套用模板
AC代码:
/*
并查集入门
2017年8月27日20:49:13
HDU1213
AC
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
const int maxn=1010;
int pre[maxn];
int n,m,a,b,ans;
int find(int x){
int r=x;
while(pre[r]!=r) r=pre[r];//查找到根节点为止
int i=x,j;
while(i!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
join(a,b);
}
}
void solve(){
ans=0;
for(int i=1;i<=n;i++){
if(find(i)==i) ans++;
}
printf("%d\n",ans);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
init();
solve();
}
return 0;
}