该文仅记录自己的思考过程,非题解
看了别人的题解和代码后感觉find挺奇怪的,先上一张图。
左图中的边的两端,表示每次merge的x,y,右图中的边的两端表示每次merge的xx,yy。
那么现在我们要求1和4之间有多少个节点,怎么求?
经过简单的模拟过后理解了。有了图很好理解。
#include <bits/stdc++.h>
using namespace std;
const int N=3e4+5;
int n,x,y,xx,yy;
int f[N],dep[N],size[N];
char str[1];
int find(int x)
{
if (f[x]==x) return x;
int fa=find(f[x]);
dep[x]+=dep[f[x]];
return f[x]=fa;
}
int main(){
scanf("%d",&n);
for (register int i=1; i<=30000; ++i) f[i]=i,size[i]=1;
while (n--)
{
scanf("%s",str);
scanf("%d%d",&x,&y);
if (str[0]=='M')
{
xx=find(x); yy=find(y);
f[xx]=yy; dep[xx]+=size[yy]; size[yy]+=size[xx];
}
else
{
xx=find(x); yy=find(y);
if (xx!=yy) printf("%d\n",-1);
else printf("%d\n",abs(dep[x]-dep[y])-1);
}
}
return 0;
}