【算法分析】
本题按“基础并查集”即可求解。
下面代码是为了练手,给出了“按秩优化”的并查集代码。
【算法代码:按秩优化】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int pre[maxn],rnk[maxn];
int find(int x) {
if(x!=pre[x]) pre[x]=find(pre[x]);
return pre[x];
}
void merge(int x,int y) {
int a=find(x);
int b=find(y);
if(rnk[a]<=rnk[b]) pre[a]=b;
else pre[b]=a;
if(rnk[a]==rnk[b] && a!=b) rnk[b]++;
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
pre[i]=i;
rnk[i]=1;
}
char op;
int a,b;
while(m--) {
cin>>op>>a>>b;
if(op=='M') merge(a,b);
else if(find(a)==find(b)) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
/*
in:
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
out:
Yes
No
Yes
*/