一、作用和基本原理
1.将两个集合合并
2.询问两个元素是否在一个集合当中
基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点储存他的父节点,p[x]表示x的父节点。
如何判断树根 p[x]==x;
如何求集合编号:while(p[x]!=x)x=p[x];
如何合并两个集合:把一个根节点接到另一个上
二、例题和代码
这是一道最简单的并查集题目,没有附加存储信息,关键就在于每个结点的祖宗结点,只需要注意这一个信息就可以了!
#include<iostream>
using namespace std;
const int N=100010;
int father[N];//下标代表的结点编号,储存的值是集合编号。当二者相同的时候就是找到树根了
int find(int x)
{
if(x!=father[x])father[x]=find(father[x]);
return father[x];
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)father[i]=i;
while(m--)
{
char op;
int a;int b;
cin>>op;
cin>>a>>b;
if(op=='M')
{
cout<<"(()"<<endl;
father[find(a)]=find(b);
cout<<"&*&*"<<endl;
}
else
{cout<<"&&";
if(find(a)==find(b))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
cout<<"**";
}
}
return 0;
}