佬佬求调|66pts
查看原帖
佬佬求调|66pts
429818
Smithespics楼主2023/3/25 16:48
using namespace std;
int pre[30005];
int bak[30005];

int Find(int x,int y)
{
    if(pre[x] == y || pre[y] == x)
        return 0;
    else
    {
        int step1 = 0,step2 = 0;
        int fx = x,fy = y;
        while(pre[fx] != fx)
        {
            //cout << fx << endl;
            fx = pre[fx];
            step1++;
            if(pre[fx] == y || pre[y] == fx)
                return step1;
        }
        while(pre[fy] != fy)
        {
            //cout << fy << endl;
            fy = pre[fy];
            step2++;
            if(pre[x] == fy || pre[fy] == x)
                return step2;
        }
    }
    return -1;
}

void Merge(int x,int y)
{
    int sx = x,fy = y;
    while(pre[sx] != sx)
        sx = pre[sx];
    while(bak[fy] != fy)
        fy = bak[fy];
    if(fy == sx)
        return;
    else
    {
        //cout << fy << ' ' << sx << endl;
        bak[fy] = sx;
        pre[sx] = fy;
    }
}

int main()
{
    for(int i = 1;i <= 30000;i++)
    {
        pre[i] = i;
        bak[i] = i;
    }

    long long t;
    cin >> t;
    for(int i = 1;i <= t;i++)
    {
        char a;
        int x,y;
        cin >> a >> x >> y;
        if(a == 'M')
            Merge(x,y);
        if(a == 'C')
        {
            int step = Find(x,y);
            cout << step << endl;
        }
    }

    return 0;
}
2023/3/25 16:48
加载中...