• POJ 1988 Cube Stacking(并查集)


    Cube Stacking
    Time Limit: 2000MS   Memory Limit: 30000K
    Total Submissions: 15900   Accepted: 5419
    Case Time Limit: 1000MS

    Description

    Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two types of operations: 
    moves and counts. 
    * In a move operation, Farmer John asks Bessie to move the stack containing cube X on top of the stack containing cube Y. 
    * In a count operation, Farmer John asks Bessie to count the number of cubes on the stack with cube X that are under the cube X and report that value. 

    Write a program that can verify the results of the game. 

    Input

    * Line 1: A single integer, P 

    * Lines 2..P+1: Each of these lines describes a legal operation. Line 2 describes the first operation, etc. Each line begins with a 'M' for a move operation or a 'C' for a count operation. For move operations, the line also contains two integers: X and Y.For count operations, the line also contains a single integer: X. 

    Note that the value for N does not appear in the input file. No move operation will request a move a stack onto itself. 

    Output

    Print the output from each of the count operations in the same order as the input file. 

    Sample Input

    6
    M 1 6
    C 1
    M 2 4
    M 2 6
    C 3
    C 4
    

    Sample Output

    1
    0
    2
    

    Source

     
     
     
    /*
    POJ 1988
    */
    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    const int MAXN=30010;
    int F[MAXN];
    int num[MAXN];//堆的数目
    int val[MAXN];//下面的个数
    int find(int x)
    {
        if(F[x]==-1)return x;
        int tmp=find(F[x]);
        val[x]+=val[F[x]];
        return F[x]=tmp;
    }
    void bing(int u,int v)//将u所在的堆放在v上面,注意顺序
    {
        int t1=find(u),t2=find(v);
        if(t1!=t2)
        {
            F[t1]=t2;
            val[t1]=num[t2];
            num[t2]+=num[t1];
        }
    }
    int main()
    {
        int P;
        int u,v;
        char op[10];
        while(scanf("%d",&P)==1)
        {
            for(int i=0;i<MAXN;i++)
            {
                F[i]=-1;
                val[i]=0;
                num[i]=1;
            }
            while(P--)
            {
                scanf("%s",&op);
                if(op[0]=='C')
                {
                    scanf("%d",&u);
                    find(u);
                    printf("%d\n",val[u]);
                }
                else
                {
                    scanf("%d%d",&u,&v);
                    bing(u,v);
                }
            }
        }
        return 0;
    }
    人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想
  • 相关阅读:
    构建之法十五
    十二周学习总结笔记
    构建之法十四
    构建之法十一
    构建之法十三
    用户体验评价
    构建之法第十章
    十一周总结学习笔记
    找水王
    十周总结学习笔记
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3000483.html
Copyright © 2020-2023  润新知