帶邊權的並查集
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int f[N], num[N], d[N];
///d[i]表示i到祖宗的距離,num[i]表示以i爲祖宗的隊列的長度,是否清零都可以,因爲合併後就用不到了
int Find(int x)
{
if(x == f[x]) return x;
int root = Find(f[x]);
d[x] += d[f[x]]; ///更新祖先,並同時更新x到祖先的距離
f[x] = root;
return root;
}
void merge(int x, int y) ///把x所處的隊列放在y所處的隊列後面
{
x = Find(x), y = Find(y);
if(x == y) return ;
f[x] = y; ///更改x的祖先爲y
d[x] += num[y]; ///更新x到祖先的距離,就是原距離加上以y爲祖先的隊列的長度
num[y] += num[x]; ///把x的數量加到y爲祖先的隊列中
num[x] = 0;
}
int main()
{
int T;
cin>>T;
for(int i = 1; i <= N; ++i) f[i] = i, num[i] = 1;
while(T--)
{
string op;
int x, y;
cin>>op>>x>>y;
if(op[0] == 'M') merge(x, y);
else{
int tx = Find(x), ty = Find(y);
if(tx != ty) puts("-1");
else printf("%d\n", max(abs(d[x]-d[y])-1, 0));
}
}
return 0;
}