传送门
带权并查集最棒了
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
*/