传送门
题意
有 (n)个数初始每个数都在一个集合,(m) 个操作,
- ((M,a,b)),将 (a) 和 (b) 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略
- ((Q,a,b)),询问 (a) 和 (b) 的两个数是否在同一个集合中;
数据范围
(1leq n,mleq 10^{5})
题解
并查集维护集合的查询与合并,时间复杂度为 (O(n·log n))
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N];
int n,m;
int find(int x){
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void merge(int a,int b){
int pa=find(a),pb=find(b);
if(pa!=pb)
fa[pa]=pb;
}
int main(){
cin>>n>>m;
char op[2];
int a,b;
for(int i=1;i<=n;i++) fa[i]=i;
while(m--){
cin>>op>>a>>b;
if(op[0]=='M')
merge(a,b);
else
if(find(a)==find(b)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}