How Many Tables
链接
[https://vjudge.net/contest/281085#problem/A]
题意
n个人参加宴席,有m个信息表示a与b认识,认识有传递性,
问最后该安排多少卓使得只有相互认识的在一起吃饭。
分析
裸的带路径压缩的并查集
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int f[1010];
int r[1010];
void init(){
for(int i=1;i<=n;i++)
f[i]=i;
}
void k(){
for(int i=1;i<=n;i++)
r[i]=1;
}
int find(int x){
if(f[x]==x) return x;
else{
f[x]=find(f[x]);
return f[x];
}
}
void unionSet(int x, int y) {
if ((x = find(x)) == (y = find(y))) return;
if (r[x] > r[y]) f[y] = x;
else {
f[x] = y;
if (r[x] == r[y]) r[y]++;
}
}
int main(){
int T,a,b;
//freopen("in.txt","r",stdin);
cin>>T;
while(T--){
cin>>n>>m;
init();
k();
for(int i=1;i<=m;i++){
cin>>a>>b;
unionSet(a,b);
}
int sum=0;
for(int i=1;i<=n;i++)
if(f[i]==i) sum++;
cout<<sum<<endl;
}
return 0;
}

浙公网安备 33010602011771号