今天是并查集专场哦,题意就不多解释了,看不懂的去补补英语吧ㄟ( ▔, ▔ )ㄏ,裸的并查集,首先初始化让每个点的根节点为他自己本身,若输入a,b认识那么就把a,b归入同一集合(也就是让a,b的根节点一样,并查集里用集合里某一个点作为根节点来代表这个集合,也叫做代表元),最后只要检测有几个代表元就可以知道最少要几个桌子了,还有一点就是路径压缩,我们每次找一点的根节点都要从他的父节点,爷爷节点啥的找过去多烦啊,如果这条路径很长查找起来就更烦啦,所以如果我们第一次查找的时候就把他路径上的每个点都直接连在根节点上就方便了。以下就是代码啦。
#include<bits/stdc++.h>
using namespace std;
int per[1005];
int sf(int x){
int r=x;
while(r!=per[r]){
r=per[r];
}
while(r!=x){
int t=per[x];
per[x]=r;
x=t;
}
return r;
}
void Union(int a,int b){
if(sf(a)!=sf(b))
per[sf(a)]=sf(b);
}
int main(){
int t,n,m,i,sum,a,b;
cin>>t;
while(t--){
cin>>n>>m;
sum=0;
for(i=1;i<=n;i++)
per[i]=i;
for(i=1;i<=m;i++){
cin>>a>>b;
Union(a,b);
}
for(i=1;i<=n;i++)
if(per[i]==i)
sum++;
cout<<sum<<endl;
}
return 0;
}
各位看官们,适合入门么。