hdu3635

/*
一开始第a个球在第a个城市 
操作T a b,把第a个球所在城市的所有球移到b所在的城市 
操作Q a 
要求输出
第a个球在哪个城市
第a个球所在的城市有几个球 
第a个球移动次数 
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define move movee
#define MAXN 10005
using namespace std;
//第i个球所在城市,第i个球所在城市有几个球,第i个球移动次数 
int F[MAXN],num[MAXN],move[MAXN];
int find(int a){
    if(F[a]==-1) return a;
    int tmp=F[a];//保存a的父亲 
    F[a]=find(F[a]);//
    move[a]+=move[tmp];
    return F[a]; 
}
//把a所在的集合移到b所在的集合 
void bing(int a,int b){
    int t1=find(a);
    int t2=find(b);
    if(t1!=t2){
        F[t1]=t2;
        move[t1]=1;
        num[t2]+=num[t1];
    } 
} 
int main(){
    int T,n,q;
    cin >> T;
    for(int tt=1;tt<=T;tt++){
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++){
            F[i]=-1;
            num[i]=1;
            move[i]=0; 
        }
        char op[10];
        int a,b;
        printf("Case %d:\n",tt);
        while(q--){
            scanf("%s",op);
            if(op[0]=='T'){
                scanf("%d%d",&a,&b);
                bing(a,b);
            }
            else {
                scanf("%d",&a);
                int tmp=find(a);
                printf("%d %d %d\n",tmp,num[tmp],move[a]);
            }
        }
    } 
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/9823351.html