poj-1988 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 }
优质内容筛选与推荐>>
1、ASP.NET验证控件详解
2、基于ajax与msmq技术的消息推送功能实现
3、js  跨越问题
4、在民间借贷软件开发中用到的电子文档存储技术
5、python中的__dict__,__getattr__,__setattr__


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号