#include<iostream>
using namespace std;
/*
* 确定一个集合的元素需要两个值:元素的值和元素所在集合的号码
* 在最开始,我们定义每个元素均为一个集合,也均为集合中的根节点,根节点的值即为标记集合的号码
* 那么合并一个集合的操作就是将其中一个集合的号码赋给另一个集合的根节点
* 查询两个元素是否在一个集合中就是查询两个元素的集合号码是否相同
*/
const int N=1e5+10;
//pre数组中的值即为集合的号码
//一个集合的根节点,元素值和集合号码相同
int pre[N];
int find(int);
void merge(int,int);
void query(int,int);
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) pre[i]=i;
while(m--){
char op;
int a,b;
cin>>op>>a>>b;
if(op=='M') merge(a,b);
else query(a,b);
}
return 0;
}
int find(int x){
//这段代码真要细品,路径压缩,难以言表
//只有根节点才满足if中的条件
if(x!=pre[x]) pre[x]=find(pre[x]);
return pre[x];
}
void merge(int a,int b){
int pre_a=find(a);
int pre_b=find(b);
if(pre_a!=pre_b) pre[pre_a]=pre_b;
}
void query(int a,int b){
int pre_a=find(a);
int pre_b=find(b);
if(pre_a==pre_b) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
Acwing_算法基础_数据结构_并查集
最新推荐文章于 2024-08-24 14:08:21 发布