hdu1213 并查集

时间:2023-03-10 01:58:04
hdu1213 并查集

题意:有 n 个朋友,他们可能相互认识,A 认识 B,B 认识 C,则 ABC 相互认识,现在给出他们的认识情况,相互认识的人坐一桌,否则需要分开坐,问至少需要多少桌。

其实就是问并查集的个数,在初始情况下一人一个并查集,共 n 个,每次合并操作会减少一个并查集,所以只要每次合并时计数减一下就行,全部合并完之后就可以输出剩余并查集个数了。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int fa[],n; void init(){
for(int i=;i<=n;i++)fa[i]=i;
} int find(int x){
int r=x,t;
while(r!=fa[r])r=fa[r];
while(x!=r){
t=fa[x];
fa[x]=r;
x=t;
}
return r;
} int main(){
int m,t;
while(scanf("%d",&t)!=EOF){
for(int q=;q<=t;q++){
cin>>n>>m;
int c=n;
int i;
init();
for(i=;i<=m;i++){
int a,b;
cin>>a>>b;
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
c--;
}
}
cout<<c<<endl;
}
}
return ;
}