并查集,简单的来说可以进行两种操作,
那么这两种操作是如何实现的呢?
我们以5个点的情况作为样例来作为情况来考虑
我们先将所有的集合都视为一个数,然后定义每个树的父节点p[x]
然后我们来进行两个操作
第一个操作
合并
这里表示的就是将1集合和5集合进行合并
即将5的父节点指向1;
查询
那就更容易了,我们只需要判断a,b两个数的根节点是否相同即可
代码
#include<iostream>
using namespace std;
const int N = 100010;
int n, m;
int p[N];
int find(int x){//找到根节点并压缩路径
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) p[i] = i;
while(m--){
char op[2];
int a, b;
scanf("%s%d%d", op, &a, &b);
if(op[0] == 'M') p[find(a)] = find(b);
else{
if(find(a) == find(b)) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}