acwing 238. 銀河英雄傳說

傳送門

帶邊權的並查集

#include<bits/stdc++.h>

using namespace std;
const int N = 1e6+10;

int f[N], num[N], d[N];
///d[i]表示i到祖宗的距離,num[i]表示以i爲祖宗的隊列的長度,是否清零都可以,因爲合併後就用不到了

int Find(int x)
{
    if(x == f[x]) return x;
    int root = Find(f[x]);
    d[x] += d[f[x]];  ///更新祖先,並同時更新x到祖先的距離
    f[x] = root;
    return root;
}

void merge(int x, int y) ///把x所處的隊列放在y所處的隊列後面
{
    x = Find(x), y = Find(y);
    if(x == y) return ;
    f[x] = y;          ///更改x的祖先爲y
    d[x] += num[y];   ///更新x到祖先的距離,就是原距離加上以y爲祖先的隊列的長度
    num[y] += num[x]; ///把x的數量加到y爲祖先的隊列中
    num[x] = 0;
} 

int main()
{
    int T;
    cin>>T;
    for(int i = 1; i <= N; ++i) f[i] = i, num[i] = 1;
    while(T--)
    {
        string op;
        int x, y;
        cin>>op>>x>>y;
        if(op[0] == 'M') merge(x, y);
        else{
            int tx = Find(x), ty = Find(y);
            if(tx != ty) puts("-1");
            else printf("%d\n", max(abs(d[x]-d[y])-1, 0));
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章