一开始每个都是单独的集合
然后建立边x,y
如果之前已经建立就一直寻找到根节点
最后以根节点统计
#include <bits/stdc++.h>
using namespace std;
const N=10001;
int s[N];
void init_set()
{
for(int i=1;i<=N;i++)s[i]=i;//初始化
}
int find_set(int x){
return x==s[x]?x:find_set(s[x]);
}
int merge_set(int x,int y){
x=find_set(x) ;y=find_set(y);
if(x!=y) s[x]=s[y];
}
int main()
{
int t,n,m,x,y;
cin>>t
while(t--){
cin>>n>>m;
init_set();
for(int i=1;i<=m;i++){
cin>>x>>y;
merge_set(x,y)
}
int ans=0;
for(int i=1;i<=n;i++)if(s[i]==i)ans++;
cout<<ans<<endl;
}
return 0;
}