【POJ-1988】Cube Stacking(并查集)

来源:互联网 发布:华为 知乎 编辑:程序博客网 时间:2024/05/17 22:23
//=====================================//      KinderRiven POJ 1899//=====================================#include<cstdio>#include<cstring>using namespace std;const int maxn = 33333;const int  INF = 30000;int fa[maxn];    //父亲结点的编号int ret[maxn];   //压在i下面有几个木块int size[maxn];  //以结点i为底的栈中元素的个数,如果i不是根,那么size[i] = 0;void init(){    for(int i = 1; i <= INF; i++){ fa[i] = i; ret[i] = 0; size[i] = 1;}}int find_father(int u){    if(fa[u] != u){        int temp = fa[u];        fa[u] = find_father(fa[u]);        if(size[u]){                //size[i]不为0说明该元素为栈底的元素            ret[u] += size[temp];            size[temp] += size[u];            size[u] = 0;        }        else                        //否则的话这个元素就是一个普通的元素            ret[u] += ret[temp];    }    return fa[u];}void union_set(int p,int q){    int fp = find_father(p);    int fq = find_father(q);    fa[fp] = fq;    find_father(p); find_father(q);    return;}int main(){    int n;    init();    scanf("%d",&n);    while(n--){        char op[10];        scanf("%s",op);        if(op[0] == 'M'){            int x,y;            scanf("%d%d",&x,&y);            union_set(x,y);        }        else{            int x;            scanf("%d",&x);            find_father(x);            printf("%d\n",ret[x]);        }    }    return 0;}

0 0
原创粉丝点击