思路

并查集 即可 .
问题在于如何 求两个战舰之间的 战舰数目 ?

我们使用 d[ ] 和 num[ ]来辅助我们解决上面的问题
d[i]:i 距离根节点(队头)的距离
num[i]:i 所在的连通块有多少个元素( i 所在那一列的战舰数目 )

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 30010;

int d[N],num[N];
int fa[N];

int find(int x){
    if(x==fa[x]) return x;
    int root=find(fa[x]);
    d[x]+=d[fa[x]];
    fa[x]=root;
    return root;
}

int main(){
    int T; scanf("%d",&T);
    for(int i=1;i<=30000;i++) fa[i]=i,num[i]=1;
    while(T--){
        char c[2];
        int x,y;
        scanf("%s%d%d",c,&x,&y);
        if(c[0]=='M'){
            x=find(x),y=find(y);
            if(x!=y){
                fa[x]=y;
                d[x]=num[y];
                num[y]+=num[x];
            }
        }
        else {
            int fx=find(x),fy=find(y);
            if(fx!=fy) puts("-1");
            else if(x==y) puts("0");
            else printf("%d\n",abs(d[x]-d[y])-1);
        }
    }
    return 0;
}