AcWing 238. 银河英雄传说
并查集,多维护一个i到p[i]的距离数组,注意数组合并时的操作
#include<bits/stdc++.h>
using namespace std;
const int N = 3e4 + 10;
int d[N]; //记录节点到p[i]的距离
int Size[N]; //记录i节点及后面段的长度
int p[N]; //祖宗节点
int n, m;
int find(int x){
if(x != p[x]){
int root = find(p[x]);
d[x] += d[p[x]];
p[x] = root;
}
return p[x];
}
int main()
{
cin>>m;
for(int i = 1; i < N; i ++ ) p[i] = i, Size[i] = 1;
for(int i = 0; i < m; i ++ ){
char op[2];
int a, b;
scanf("%s%d%d", op, &a, &b);
if(op[0] == 'M'){
int fa = find(a), fb = find(b);
if(fa != fb){ //注意两战舰不在一个队列时才需要操作
d[fa] += Size[fb];
Size[fb] += Size[fa];
p[fa] = fb;
}
}
else if(op[0] == 'C'){
int fa = find(a), fb = find(b);
if(fa != fb){
cout<<"-1"<<endl;
}
else if(fa == fb){
int t = max(0, abs(d[a] - d[b]) - 1);
cout<<t<<endl;
}
}
}
return 0;
}