题目链接
题意
给定朋友关系,问最终有多少组朋友
思路
裸的并查集,最终跑一遍find函数看看有几个不同的组就可以了
代码
#include<iostream>
#include<cmath>
#include<cstring>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
const int maxn=30500;
const int inf=0x3f3f3f3f;
int fa[maxn*3];
int ra[maxn];
bool bl[maxn];
int n,m,k;
void init(){
for(int i=0;i<maxn;i++){
fa[i]=i;
ra[i]=0;
}
return ;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unite(int x,int y){
x=find(x); y=find(y);
if(x==y)
return ;
else if(ra[x]<ra[y]){
fa[x]=y;
}
else{
fa[y]=x;
if(ra[x]==ra[y])
ra[x]++;
}
}
int main(){
IOS
int tn;
cin>>tn;
while(tn--){
memset(bl,0,sizeof(bl));
init();
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
unite(a,b);
}
int ans=0;
for(int i=1;i<=n;i++)
bl[find(i)]=1;
for(int i=1;i<=n;i++)
if(bl[i])
ans++;
cout<<ans<<endl;
}
}