Dragon Balls

这里写图片描述这里写图片描述这里写图片描述
题意:
五百年后,龙珠的数量会出乎意料地增加,因此孙悟空(吴)将所有的龙球聚集在一起太难了。
他的国家有N个城市,世界上正好有N个龙球。起初,对于第i个龙球,神圣的龙将把它放在第i个城市。长年以来,一些城市的龙球将被运往其他城市。为了挽救体力,吴孔计划采用飞行云中云,一种神奇的飞云收集龙珠。
每次武功收集一个龙球的信息,他都会问你那个球的信息。你必须告诉他球在哪个城市以及那个城市有多少个龙球,你还需要告诉他到目前为止球的运输次数。
输入
输入的第一行是单个正整数T(0

/********************************
带权并查集 
********************************/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 1e5+5;

int par[maxn],val[maxn],trans[maxn];
int n,m;

void init() {
    for (int i = 0;i<=n;i++) {
        par[i] = i;
        val[i] = 1;
        trans[i] = 0;
    }
}

int find(int x) {
    if ( x == par[x] ) return x;
    else {
        int tmp = find(par[x]);
        if(tmp != par[x]) trans[x] += trans[par[x]];
        return par[x] = tmp;
    }
}

void unite(int x,int y) {
    int fx = find(x),fy = find(y);
    if(fx != fy) {
        trans[fx]++;
        val[fy] += val[fx];
        par[fx] = fy;
    }
}

int main() {
    int t; cin>>t;
    int ncase = 1;
    while(t--)
    {
        scanf("%d %d",&n,&m); char op; int a,b;
        init();
        printf("Case %d:
",ncase++);
        while(m--) {
            getchar();
            scanf("%c",&op);
            if ( op == 'T' ) {
                scanf("%d %d",&a,&b);
                unite(a,b);
            } else if ( op == 'Q' ) {
                scanf("%d",&a);
                int c = find(a);
                printf("%d %d %d
",c,val[c],trans[a]);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Nlifea/p/11745959.html