带权并查集
dis[Lfa]+=rk[Rfa];
rk[Rfa]+=rk[Lfa];
太难了!!
WA了无数次,才AC
代码 :
#include<bits/stdc++.h>
using namespace std;
const int MAXN=30000+7;
int T;
int fa[MAXN],dis[MAXN],rk[MAXN];
void init(){
for(int i=1;i<MAXN;i++){
dis[i]=0;
rk[i]=1;
fa[i]=i;
}
}
int findfa(int x){
if(fa[x]==x) return x;
int father=fa[x];
fa[x]=findfa(fa[x]);
dis[x]+=dis[father];
return fa[x];
}
void unio(int x,int y){
int Lfa=findfa(x);
int Rfa=findfa(y);
if(Lfa!=Rfa){
fa[Lfa]=Rfa;
dis[Lfa]+=rk[Rfa];
rk[Rfa]+=rk[Lfa];
}
}
int main(){
ios::sync_with_stdio(false);
init();
char op;
int i,j;
cin>>T;
while(T--){
cin>>op;
if(op=='M'){
cin>>i>>j;
unio(i,j);
}
if(op=='C'){
cin>>i>>j;
int Lfa=findfa(i);
int Rfa=findfa(j);
if(Lfa!=Rfa) cout<<"-1"<<"\n";
else cout<<abs(dis[i]-dis[j])-1<<"\n";
}
}
}