思路:
:中规中矩的并查集模板题,没有丝毫变形哦~
代码:
:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max_n=1e3+10;
int t,n,m;
int par[Max_n];
int ran[Max_n];
int find(int x){
if(par[x]==x)return x;
return par[x]=find(par[x]);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y)return;
if(ran[x]<ran[y])par[x]=y;
else par[y]=x;
if(ran[x]==ran[y])ran[x]++;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++){
par[i]=i;
ran[i]=0;
}
int a,b;
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
unite(a,b);
}
int ans=0;
for(int i=1;i<=n;i++){
if(par[i]==i)ans++;
}
printf("%d\n",ans);
}
return 0;
}