题目:https://www.luogu.org/problemnew/show/P1196
注意带权并查集的写法,以及集合长度(len[])的实现。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int t,a,b,fa[30005],len[30005],pos[30005];
char dc;
int find(int x)
{
if(fa[x]==x)return x;
int f=find(fa[x]);
pos[x]+=pos[fa[x]];
return fa[x]=f;
}
int main()
{
scanf("%d",&t);
for(int i=1;i<=30000;i++)fa[i]=i,pos[i]=0,len[i]=1;
for(int i=1;i<=t;i++)
{
scanf(" %c",&dc);
scanf("%d%d",&a,&b);
if(dc=='M')
{
int u=find(a);
int v=find(b);
fa[v]=u;
pos[v]=pos[u]+len[u];
len[u]+=len[v];
// len[v]=len[u];
}
else
{
int u=find(a);
int v=find(b);
if(u!=v)printf("-1\n");
else
{
int ans;
if(pos[a]>pos[b])ans=pos[a]-pos[b]-1;
else ans=pos[b]-pos[a]-1;
printf("%d\n",ans);
}
}
}
return 0;
}