#include<iostream>
#include<vector>
using namespace std;
class DSU{
private:
vector<int> parent;
vector<int> rank;
public:
DSU(int n){
parent.resize(n+1);
rank.resize(n+1,0);
for(int i=1;i<=n;i++){
parent[i]=i;
}
}
int find(int x){
if(parent[x]!=x){
parent[x]=find(parent[x]);
}
return parent[x];
}
void unionSets(int x,int y){
int rootX=find(x);
int rootY=find(y);
if(rootX==rootY){
return;
}
if(rank[rootX]<rank[rootY]){
parent[rootX]=rootY;
}else if(rank[rootY]<rank[rootX]){
parent[rootY]=rootX;
}else{
parent[rootY]=rootX;
rank[rootX]++;
}
}
bool isConnected(int x,int y){
return find(x)==find(y);
}
};
int t;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
DSU uf(30005);
cin>>t;
while(t--){
char ch;
int a,b;
cin>>ch>>a>>b;
if(ch=='M'){
uf.unionSets(a,b);
}else{
if(uf.isConnected(a,b)){
cout<<1;
}else{
cout<<-1;
}
cout<<endl;
}
}
return 0;
}
本地过了啊,交上去调不出来(满江红QWQ),不就是按秩合并的优化版并查集吗?