糯米

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

POJ 1988 Cube Stacking 并查集

纪念一下,跟我生日一样的题目。
思路:
这题可以用并查集来做,也是挺取巧的。
每个栈看做是一个集合,用一个数组记录栈中元素离栈底的距离,一个数组记录每个栈底元素对应的栈顶的元素。
对于移动操作,只需要合并集合,然后更改栈顶元素数组就行了。

用了栈写的路径压缩,代码跑到230ms。不知道那些100ms是怎么搞出来的。。真的有什么神奇技巧吗。

#include <stdio.h>

#define MAX_N 30032

int top[MAX_N];
struct set_node {
    
int parent, dis;
}
;
struct set_node set[MAX_N];

__inline 
int find(int idx)
{
    
static int stk[MAX_N], sp, i;

    
for (sp = 0set[idx].parent; sp++{
        stk[sp] 
= idx;
        idx 
= set[idx].parent;
    }

    
for (sp--; sp >= 0; sp--{
        i 
= stk[sp];
        
set[i].dis += set[set[i].parent].dis;
        
set[i].parent = idx;
    }


    
return idx;
}


int main()
{
    
int p, a, b;
    
char op[16];

    freopen(
"e:\\test\\in.txt""r", stdin);

    
for (a = 0; a < MAX_N; a++)
        top[a] 
= a;

    scanf(
"%d"&p);
    
while (p--{
        scanf(
"%s%d", op, &a);
        
if (op[0== 'M'{
            scanf(
"%d"&b);
            a 
= find(a);
            b 
= find(b);
            
set[a].parent = top[b];
            
set[a].dis = 1;
            top[b] 
= top[a];
        }
 else {
            find(a);
            printf(
"%d\n"set[a].dis);
        }

    }


    
return 0;
}

posted on 2010-03-13 23:07 糯米 阅读(222) 评论(0)  编辑 收藏 引用 所属分类: POJ


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