zoukankan      html  css  js  c++  java
  • POJ1988 并查集的使用

    Cube Stacking

    Time Limit: 2000MS   Memory Limit: 30000K
    Total Submissions: 21157   Accepted: 7395
    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
    
     1 #include<stdio.h>
     2 #define N 30001
     3 
     4 int count[N], num[N], pre[N];
     5 
     6 void inite()
     7 {
     8     for(int i = 0; i < N; i++)
     9     {
    10         count[i] = 0;
    11         num[i] = 1;
    12         pre[i] = i;
    13     }
    14 }
    15 
    16 int find(int x)
    17 {
    18     if(pre[x] == x)
    19         return x;
    20 
    21     int t = find(pre[x]);
    22     count[x] += count[pre[x]];
    23     pre[x] = t;
    24     return t;
    25 
    26 }
    27 void Union(int x, int y)
    28 {
    29     int i = find(x);
    30     int j = find(y);
    31     if(i == j)
    32     {
    33         return;
    34     }
    35     count[i] = num[j];
    36     num[j] += num[i];
    37     pre[i] = j;
    38 }
    39 
    40 
    41 
    42 int main()
    43 {
    44     int i, x, y, n;
    45     char s[2];
    46     scanf("%d",&n);
    47     inite();
    48     for(i = 0; i < n; i++)
    49     {
    50         scanf("%s",s);
    51         if(s[0] == 'M')
    52         {
    53             scanf("%d%d",&x,&y);
    54             Union(x,y);
    55         }
    56         else if(s[0] == 'C')
    57         {
    58             scanf("%d",&x);
    59             int c = find(x);
    60             printf("%d
    ",count[x]);
    61         }
    62     }
    63     return 0;
    64 }
    View Code
     
  • 相关阅读:
    好代码收藏
    JVM
    关于Redis
    记录ok6410 使用ov9650摄像头的过程
    记录一下在uyuv 转 planar yuv420 的做法
    mini2440 使用的mkyaffs2image 工具的源码
    hi3516a imx178 uboot 默认启动参数
    记录ok6410 使用fast150u 无线网卡的过程 其中部分内容为转载 没有修改
    ubuntu建立tftp服务器有两种方式
    转载hi3516 sd 只读解决
  • 原文地址:https://www.cnblogs.com/cjshuang/p/4678789.html
Copyright © 2011-2022 走看看