【题解】
建立并查集,并维护每个结点到root的距离、每个连通块中结点的个数sum
"M i j"即:将father(i)到root的距离改为 sum[father(y)],将sum[father(y)]增加 sum[father(x)]
【代码】
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int fa[30005],dis[30005]={0},sum[30005];
int father(int x)
{
int t;
if(fa[x]!=x)
{
t=father(fa[x]);
dis[x]+=dis[fa[x]];
fa[x]=t;
}
return fa[x];
}
int main()
{
char opt;
int T,x,y,fx,fy,i;
scanf("%d",&T);
for(i=1;i<=30000;i++)
{
fa[i]=i;
sum[i]=1;
}
for(;T>0;T--)
{
scanf("\n%c %d%d",&opt,&x,&y);
fx=father(x);
fy=father(y);
if(opt=='M')
{
dis[fx]=sum[fy];
sum[fy]+=sum[fx];
fa[fx]=fy;
}
else
{
if(fx!=fy) printf("-1\n");
else printf("%d\n",abs(dis[y]-dis[x])-1);
}
}
return 0;
}