zoukankan      html  css  js  c++  java
  • poj1988 Cube Stacking **

     1 /*
    2 * poj-1988 Cube Stacking.cpp
    3 *
    4 * Created on: 2012-2-12
    5 * Author: LongDou
    6 *
    7 * 并查集:
    8 * 每个节点有3个域:1、fa[x]:并查集中x的父节点 (fa[x]必压在x之下,但不一定直接相邻)
    9 * 2、rank[x]:在x之下(不包括x)且在fa[x]之上(包括fa[x])的方块数
    10 * (如果直接记录x之下的总方块数,则每次合并都需更新某个集合中所有元素的
    11 * rank域;而这样记录的话,合并操作只需更新某个集合的根结点的rank域,
    12 * 同时对一次询问“C x”,只需计算x到根的rank值之和,复杂度不大)
    13 * 3、stackNum[x]:x当前所在的stack标号(仅树根节点有意义)
    14 *
    15 * 每次 M x y 操作, 合并x和y两个集合,注意更新各stack当前所含的方块数
    16 * findSet操作在路径压缩时注意更新rank域
    17 *    
            (另:刘汝佳的黑书中P81例题3与此题类似,解题也一样,只是略简洁一些。。。)
    18 */
    19 #include <cstdio>
    20 using namespace std;
    21
    22 const int maxn = 30000 + 10;
    23 const int maxp = 100000 + 10;
    24
    25 int num[maxn] = {}; //stack当前所含的方块数
    26 int fa[maxn], rank[maxn], stackNum[maxn];
    27
    28 void init(){
    29 for(int i=0; i<maxn; i++){
    30 num[i] = 1;
    31 fa[i] = i;
    32 rank[i] = 0;
    33 stackNum[i] = i;
    34 }
    35 }
    36
    37 int findSet(int x){
    38 if(x == fa[x])
    39 return x;
    40
    41 int tmp = fa[x];
    42 fa[x] = findSet(fa[x]);
    43 rank[x] += rank[tmp]; //更新rank域
    44
    45 return fa[x];
    46 }
    47
    48 void unionSet(int x, int y){
    49 int fx = findSet(x);
    50 int fy = findSet(y);
    51
    52 if(fx == fy) return;
    53
    54 fa[fx] = fy;
    55 rank[fx] += num[stackNum[fy]];
    56
    57 //更新各stack当前所含的方块数
    58 num[stackNum[fy]] += num[stackNum[fx]];
    59 num[stackNum[fx]] = 0;
    60 }
    61
    62 int main(){
    63 int p, x, y;
    64 char op;
    65
    66 init();
    67
    68 scanf("%d", &p);
    69 for(int i=0; i<p; i++){
    70 getchar();
    71 scanf("%c", &op);
    72
    73 if(op == 'M'){
    74 scanf("%d%d", &x, &y);
    75 unionSet(x, y);
    76 }
    77 else{
    78 scanf("%d", &x);
    79 int fx = findSet(x);
    80 printf("%d\n", rank[x] + rank[fx]);
    81 }
    82 }
    83
    84
    85
    86 return 0;
    87 }
  • 相关阅读:
    .net Framework 4.5 MVC4 + RabbitMQ
    阿里云飞天系统的技术架构(转)
    ORA12899错误解决记录
    网络通讯函数测试记录
    .应该用CreateThread还是_beginthreadex(), 为什么?( 转载)
    发挥v$SQL视图的作用(oracle)
    ClickHouse笔记
    MySQL字段是JsonArray格式怎么查询数据
    Base64编码保存为图片,java工具类
    java两个线程交替打印数字
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2348072.html
Copyright © 2011-2022 走看看