思路
并查集 即可 .
问题在于如何 求两个战舰之间的 战舰数目 ?
我们使用 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;
}
京公网安备 11010502036488号