思路:此题很明显需要运用并查集,且查询最大次数为T,需进行路径压缩,否则会超时,路径压缩我们怎么保持原有的顺序呢,我们可以用d[i]来表示点i到父亲节点的距离,通过递归更新父亲节点到根节点的距离,那么i到根节点的距离就是d[i]+d[fa[x]]
将b列连接到a列时呢,因为a列中的节点距离已经不会发生变化了,所以只需要更新b列到a列根节点的距离 d[b],d[b]不就是a列所有战舰个数吗,所以我们需要用一个size数组来维护每个堆的个数
#include<bits/stdc++.h>
using namespace std;
const int N=30000+5;
int fa[N],d[N],sz[N];
int find(int x)
{
if(x!=fa[x])
{
int root=find(fa[x]);
d[x]+=d[fa[x]];
fa[x]=root;
}
return fa[x];
}
void merge(int a,int b)
{
fa[a]=b;
d[a]=sz[b];
sz[b]+=sz[a];
}
int main()
{
for(int i=0;i<N;i++)
{
fa[i]=i;
sz[i]=1;
}
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
char c;
int a,b;
cin>>c>>a>>b;
if(c=='M')
{
int pa=find(a),pb=find(b);
merge(pa,pb);
}
else
{
if(find(a)==find(b)) cout<<max(abs(d[a]-d[b])-1,0)<<endl;
else cout<<-1<<endl;
}
}
return 0;
}