题意:
五百年后,龙珠的数量会出乎意料地增加,因此孙悟空(吴)将所有的龙球聚集在一起太难了。
他的国家有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:\n",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\n",c,val[c],trans[a]);
}
}
}
return 0;
}