添加链接描述

d[N] 数组记录离父节点的距离,size数组记录父节点的大小

#include <bits/stdc++.h>
using namespace std;
const int N=31000+10;
int fa[N],n,t,i,j,d[N],size[N];//size就是记录个数
int get(int x)
{
    if(x==fa[x] ) return x;
    int root=get(fa[x]);
    d[x]+=d[fa[x]];
    return fa[x]=root;
}
void merge(int x,int y)
{
    x=get(x),y=get(y);
    fa[x]=y;
    d[x]=size[y];
    size[y]+=size[x];
}
int main()
{
    scanf("%d\n",&t);
    for(i=1;i<=30000;i++)
        fa[i]=i,size[i]=1;
    while(t--)
    {
        char ch=getchar();
        scanf("%d %d\n",&i,&j);
        if (ch=='M')
            merge(i,j);
        else
        {
            if (get(i)==get(j))
                cout<<abs(d[i]-d[j])-1;
            else
                cout<<"-1";
            cout<<endl;
        }
    }
    return 0;
}

 posted on 2019-08-24 20:34  谁是凶手1703  阅读(50)  评论(0)    收藏  举报