糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

HDU 2818 Building Block 并查集

这题算是半道水题了。但代码实现还是有点麻烦,所以还是值得一写。
同一堆的方块位于同一个集合。
每个方块保存一个值:距离底部的高度
作为集合根部节点的方块保存一个值:这堆方块的高度
在并查集的合并以及查找过程中需要维护这两个值。

#include <stdio.h>

#define N 65536

int P, parent[N], pos[N], top[N], stk[N];

int fs(int idx)
{
    
int i;

    
for (i = 0; parent[idx] != idx; i++{
        stk[i] 
= idx;
        idx 
= parent[idx];
    }


    
for (i--; i >= 0; i--{
        pos[stk[i]] 
+= pos[parent[stk[i]]];
        parent[stk[i]] 
= idx;
    }


    
return idx;
}


int main()
{
    
char op[16];
    
int x, y, rx, ry;

    
for (x = 0; x < N; x++{
        top[x] 
= 1;
        parent[x] 
= x;
    }


    scanf(
"%d"&P);
    
while (P--{
        scanf(
"%s", op);
        
if (*op == 'M'{
            scanf(
"%d%d"&x, &y);
            rx 
= fs(x);
            ry 
= fs(y);
            
if (rx != ry) {
                parent[rx] 
= ry;
                pos[rx] 
= top[ry];
                top[ry] 
+= top[rx];
            }

        }
 else {
            scanf(
"%d"&x);
            fs(x);
            printf(
"%d\n", pos[x]);
        }

    }

    
    
return 0;
}

posted on 2010-10-25 21:50 糯米 阅读(530) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理