題意:
有N的龍珠,編號爲1~N,開始時分別分佈在編號爲1~N的城市。
然後如果是輸入T a b,那麼進行移動, 把編號a的龍珠所在的城市的所有龍珠移動到編號b龍珠所在的城市。
輸入Q a, 那麼輸出a龍珠所在的城市, a龍珠所在城市有的龍珠的個數, 以及a龍珠移動的次數。
思路:
代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 10002
using namespace std;
int N, Q, father[MAXN], rank[MAXN], num[MAXN];
void init(){
for(int i=1; i<=N; ++i){
father[i] = i, rank[i] = 1, num[i]=0;
}
}
int find(int x){
if(x==father[x]) return x;
int t=father[x];
father[x] = find(father[x]);
num[x] += num[t];
return father[x];
}
void Union(int x,int y){
int a=find(x);
int b=find(y);
if(a!=b){
father[a] = b;
rank[b] += rank[a];
num[a] = 1; // 這是球a第一次移動
}
}
int main(){
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif
int T,a,b,k,cas=1; char cmd[2];
scanf("%d", &T);
while(T--){
printf("Case %d:\n",cas++);
scanf("%d %d", &N,&Q);
init();
for(int i=0; i<Q; ++i){
scanf("%s", cmd);
if(cmd[0]=='T'){
scanf("%d %d", &a, &b);
Union(a, b);
}
else{
scanf("%d", &k);
int x = find(k);
int cnt=0;
printf("%d %d %d\n", x, rank[x],num[k]);
}
}
}
return 0;
}