HDU 3635 ( Dragon Balls)

来源:互联网 发布:火车票造假图片软件 编辑:程序博客网 时间:2024/06/13 22:37
#include<stdio.h>#include<string.h>int id[10010],trans[10001],Size[10001];int idq,idp,n,m;int ans[10001][3];char kind;int Quickfind(int a){    while(id[a]!=id[id[a]]){        trans[a]+=trans[id[a]];        id[a]=id[id[a]];    }    return id[a];}void Quickution(int idq, int idp){   id[idq]=idp;   Size[idp]+=Size[idq];   trans[idq]+=1;}int main(){    int i,j;    int a,b;    int ball;    int num;    scanf("%d",&num);    int sum=0;    while(num--){            int N=0;        scanf("%d %d",&n,&m);        memset(trans,0,sizeof(trans));        for(i=1;i<=n;i++){            Size[i]=1;        }        for(i=1;i<=n;i++){            id[i]=i;        }        for(i=0;i<m;i++){                getchar();        scanf("%c",&kind);            if(kind=='T'){                scanf("%d %d",&a,&b);                idq=Quickfind(a);                idp=Quickfind(b);                Quickution(idq,idp);            }            else {                    scanf("%d",&ball);                idq=Quickfind(ball);                ans[N][0]=id[idq];                ans[N][1]=Size[idq];                int b=Quickfind(ball);                ans[N][2]=trans[ball];                N++;            }        }        sum++;        printf("Case %d:\n",sum);        for(i=0;i<N;i++){            printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);        }    }    return 0;}并查集算法的应用:应为要记录转移次数,使得压缩结点的方法和原先的不一样了,原来是int Quickfind(int n){    while(n!=id[n]){        id[n]=id[id[n]];//压缩路径        n=id[n];    }    return n;}现在是:int Quickfind(int n){    while(id[n]!=id[id[n]]){//如果当前节点的前一节点不是根节点的化,当前节点的转移次数就要更新,及加上前一节点的转移次数        trans[n]+=trans[id[n]];        id[n]=id[id[n]];//压缩路径    }    return id[n];}

1 0
原创粉丝点击