POJ 1988 Cube Stacking 并查集

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;
}

你可能感兴趣的:(POJ 1988 Cube Stacking 并查集)