传送门
带权并查集最棒了
dep记录深度,size记录集合大小
转移见代码
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=31000;
int n,m;
int t;
int dep[N],fa[N],size[N];
char s;
int a,b;
int find(int x){
if(fa[x]==x) return x;
else{
int o=fa[x];
fa[x]=find(fa[x]);
dep[x] += dep[o];
return fa[x];
}
}
void merge(int a,int b){
int aa=find(a),bb=find(b);
dep[aa]=size[bb];
size[bb]+=size[aa];
fa[aa]=bb;
return;
}
int main(){
scanf("%d",&t);
for(int i=1;i<=30000;i++){
size[i]=1;fa[i]=i;
}
for(int i=1;i<=t;i++){
cin>>s;
scanf("%d%d",&a,&b);
if(s=='M') merge(a,b);
else{
if(find(a)!=find(b)) printf("-1\n");
else{
printf("%d\n",abs(dep[a]-dep[b])-1);
}
}
}
// for(int i=1;i<=4;i++) printf("%d ",dep[i]);
return 0;
}
/*
10
C 1 2
M 2 4
C 4 2
*/