欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【NOI-2002】银河英雄传说

程序员文章站 2022-06-02 19:55:08
...

【NOI-2002】银河英雄传说
【NOI-2002】银河英雄传说
【NOI-2002】银河英雄传说
【NOI-2002】银河英雄传说

#include <bits/stdc++.h>
using namespace std;

const int N = 1 << 20;
int fa[N], dist[N], size[N];

int get(int x) {
    if (x == fa[x]) return x;
    int root = get(fa[x]);
    dist[x] += dist[fa[x]];
    return fa[x] = root;
}

void merge(int x,int y) {
    x = get(x), y = get(y);
    fa[x] = y, dist[x] += size[y];
    size[y] += size[x];
}

int main() {
    int  T; cin >> T;
    for (int i = 1; i <= 30000; ++i) {
        fa[i] =i; size[i] = 1;
    }
    while (T--) {
        char op; int x, y;
        getchar();
        scanf("%c %d %d",&op, &x, &y);
        if (op == 'M') {
            merge(x,y);
        }
        if (op == 'C') {
            if (get(x) == get(y)) {
                printf("%d\n",abs(dist[x]-dist[y])-1);
            }  else  {
                puts("-1");
            }
        }
    }
    return 0;
}
相关标签: ACM-ICPC题集