1. 程式人生 > >[NOI2002]銀河英雄傳說 又是並查集!

[NOI2002]銀河英雄傳說 又是並查集!

[NOI2002]銀河英雄傳說

[NOI2002]銀河英雄傳說の傳送門(luogu)

帶權並查集哇嗚嗚嗚
又WAWAWA了

Code

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;

int T, x, y, fa[30007], dis[30007], num[30007];
char s[2];

inline int abss(int x){
    return x > 0 ? x : -x;
}
int find(int x){
    if (x != fa[x]){
        int k = fa[x];
        fa[x] = find(fa[x]);
        dis[x] += dis[k];
        num[x] = num[fa[x]];
    }
    return fa[x];
}

int main(){
    scanf("%d", &T);
    for (int i = 1; i <= 30000; ++i)
        fa[i] = i, num[i] = 1;
    while (T--){
        scanf("%s%d%d", s + 1, &x, &y);
        int fx = find(x), fy = find(y);
        if (s[1] == 'M'){
            if (fx != fy){
                fa[fx] = fy;
                dis[fx] = dis[fy] + num[fy];
                num[fy] += num[fx];
                num[fx] = num[fy];
            }
        }
        else
            if (fx != fy)
                printf("-1\n");
            else
                printf("%d\n", abss(dis[x] - dis[y]) - 1);
    }
    return 0;
}