C++
$\color{#cc33ff}{— > 算法基础课题解}$
合并操作
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int p[N];//存储每个节点的父节点是谁
//最基本的并查集
int find (int x){//返回x所在集合的编号(或者说:返回x的祖宗节点)+ 路径压缩
if (p[x] != x) p[x] = find(p[x]);//如果p[x] != x,说明x不是根节点
return p[x];
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i ++) p[i] = i;//将每个节点的父值赋成自己
while (m --){
string op;
int a, b;
cin >> op >> a >> b;
if (op == "M") p[find(a)] = find(b); //pa的父节点直接等于pb
else {
if (find(a) == find(b)) cout <<"Yes" << endl;//如果两个节点的祖宗节点相等,说明在一个集合里
else cout << "No" << endl;
}
}
return 0;
}