直接贴代码了。
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
#define maxn 1005
int par[maxn];//父亲
int Rank[maxn];//树的高度
//初始化
void init(int n)
{
for(int i=0;i<n;i++){
par[i]=-1;
Rank[i]=0;
}
}
//查询父亲,路径压缩
int Find(int x)
{
int s;
for(s=x;par[s]!=-1;s=par[s]);
while(s!=x){
int temp=par[x];
par[x]=s;
x=temp;
}
return s;
}
//合并x,y属于的集合
void unite(int x,int y)
{
x=Find(x);y=Find(y);
if(x==y) return;
if(Rank[x]<Rank[y]){
par[x]=y;
}
else{
par[y]=x;
if(Rank[x]==Rank[y]) Rank[x]++;
}
}
bool same(int x,int y)
{
return Find(x)==Find(y);
}
int main()
{
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
init(n);
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
x--;y--;
if(!same(x,y)) unite(x,y);
}
set<int> a;
for(int i=0;i<n;i++){
a.insert(Find(i));
}
cout<<a.size()<<endl;
}
return 0;
}

本文详细介绍了并查集数据结构的实现与应用,包括初始化、查找、合并等核心操作,并通过一个具体的C++代码示例展示了如何使用并查集解决实际问题。特别地,文章还解释了路径压缩技巧以提高查找效率。
11万+

被折叠的 条评论
为什么被折叠?



