AcWing 836. 合并集合
原题链接
简单
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n,m;
int p[N],r[N]; //p[N]表示根节点,r[N]表示高度
//路径压缩
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
//按秩合并
void merge(int a,int b){
a = find(a),b = find(b);
if(a == b) return ;
if(r[a] > r[b]) p[b] = a;
else{
p[a] = b;
if(r[a] == r[b]) r[b]++;
}
}
// //非按值合并
// void merge(int a,int b){
// p[find(a)] = find(b);
// }
int main(){
cin >> n >> m;
for(int i = 1; i<= n; i++){
p[i] = i;
r[i] = 1;
}
while(m--){
char op[2];
int a,b;
scanf("%s%d%d",op,&a,&b);
if(*op == 'Q'){
if(find(a) == find(b)) puts("Yes");
else puts("No");
}
else merge(a,b);
}
return 0;
}