AcWing 836. 合并集合
原题链接
简单
作者:
YMYS
,
2025-03-13 21:44:25
·河南
,
所有人可见
,
阅读 3
/*
* @Author: YMYS
* @Date: 2025-03-12 22:08:31
* @LastEditTime: 2025-03-13 21:43:36
* @FilePath: \VScode-C&C++-Coding\蓝桥杯真题\官网题库\xxx.cpp
* @URL:https://www.acwing.com/problem/content/838/
* @Description: 836. 合并集合
*
* 并查集基本模板
*
*/
#include<bits/stdc++.h>
#define int long long
#define err cout << "error" << endl
using namespace std;
const int N = 1e5 +10;
// int T;
// void solve(){
// }
int n,m;
int p[N];//p[i]表示i的父亲节点
//find(x)函数:查找x的根节点 + 路径压缩
//时间复杂度接近O(1)
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
signed main()
{
#ifdef ABC
freopen("D:/daily_Coding/VScode-C&C++-Coding/in.in", "r", stdin);
freopen("D:/daily_Coding/VScode-C&C++-Coding/out.out", "w", stdout);
#endif
std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
// cin>>T;
// while(T--){
// solve();
// }
cin>>n>>m;
//初始化并查集,每一个节点的父亲节点都是其自己
for(int i = 1; i <= n; i++) {
p[i] = i;
}
for(int i=0;i<m;i++){
char c;
int a,b;
cin>>c>>a>>b;
if(c == 'M'){
p[find(a)] = find(b);//a的根节点的父亲节点,变成b的根节点
}else{
if(find(a) == find(b)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}