题目
分析
很经典的并查集模板题
代码
#include<iostream>
using namespace std;
const int N=100005;
int p[N];//P[N]的值存储的是N这个数的父节点
int find(int x){ //返回x的祖宗节点+路径压缩
if(x!=p[x]){ //如果x没有到根节点,那么一直往上走,并使得每个点最后都指向根节点
p[x]=find(p[x]);
}
return p[x];
}
int main(){
int n,m;
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[0]=='M'){ //合并集合
p[find(a)]=find(b); //a的根节点的父节点=b的跟节点,把a作为b的一个子树
}else{ //查询操作
if(find(a)==find(b)){ //如果a的根节点和b的根节点相等,那么属于同一个集合
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}
return 0;
}