hdu 3635 Dragon Balls(并查集)

题意:

N个城市,每个城市有一个龙珠。

两个操作:

1.T A B:A城市的所有龙珠转移到B城市。

2.Q A:输出第A颗龙珠所在的城市,这个城市里所有的龙珠个数,第A颗龙珠总共到目前为止被转移了多少次。

思路:

前两个好求,第三个求转移的次数只要把它到根的路径上的值加起来就行了

看代码

代码:

int N,Q;
int fa[10005], ballNum[10005], moveTime[10005];


int findFa(int x){
    if(fa[x]==x)
        return fa[x];
    int t=findFa(fa[x]);
    moveTime[x]+=moveTime[fa[x]];
    ballNum[x]=ballNum[t];
    return fa[x]=t;
}



int main(){

    int T;
    cin>>T;
    rep(t,1,T){
        scanf("%d%d",&N,&Q);

        rep(i,1,N){
            fa[i]=i;
            ballNum[i]=1;
            moveTime[i]=0;
        }

        printf("Case %d:
",t);
        while(Q--){
            char ope[5];
            int A,B;
            scanf("%s",ope);
            if(ope[0]=='T'){
                scanf("%d%d",&A,&B);
                int fA=findFa(A);
                int fB=findFa(B);
                if(fA!=fB){
                    ballNum[fB]+=ballNum[fA];
                    moveTime[fA]++;
                    fa[fA]=fB;
                }
            }else{
                scanf("%d",&A);
                findFa(A);
                printf("%d %d %d
",fa[A],ballNum[A],moveTime[A]);
            }
        }
    }

    return 0;
}
原文地址:https://www.cnblogs.com/fish7/p/4332740.html