本文最后更新于-1天前,其中的信息可能已经过时,如有错误请发送邮件到2392862431@qq.com
基本原理:
并查集也是利用树状数组来表示数据,并查集主要实现两大功能,第一实现将两个集合合并,第二就是询问两个元素是否在一起,并查集能够实现询问的关键就在于,并查集每个位置存储的是上一个元素的编号,也就是父节点,直到到达树根,树根就是p[x]=x的点,合并集合操作是直接将一个集合的根节点的值改为另一个根节点的编号。

实现过程:
1、初始化,使每个元素的p[x]中的值都为自身。
for(int i=1;i<=n;i++)
{
p[i]=i;
}
2、find函数的实现,递归寻找元素所在集合的根节点
int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
else
return p[x];
}
3、实现查询操作
cin>>a>>b;
if(find(a)==find(b))
cout<<"Yes";
else
cout<<"No";
4、实现合并操作
p[find(a)]=find(b);
代码实现
#include <iostream>
using namespace std;
const int N=100010;
int p[N];
int n,m;
int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
else
return p[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
p[i]=i;
}
while(m--)
{
int a,b;
char op[2];
scanf("%s%d%d",op,&a,&b);
if(*op=='M')
{
p[find(a)]=find(b);
}
else
{
if(find(a)==find(b))
printf("Yes");
else
}
}
return 0;
}









