pku 1988 poj Cube Stacking 并查集

两种操作,叠立方体,数某个立方体下面有几个立方体;操作次数很多,采用并查集实现

其中above[i]表示在 i 上面的立方体个数

sum[i]表示根节点i下面的立方体个数,包括i

所以x下面的立方体个数就等于x的根节点下面的总的立方体个数减去x上面的立方体个数

(直接记录x的下面的立方体个数貌似有难度)

View Code
#include<stdio.h>
#include
<string.h>
#define MAX 30010
int fa[MAX],sum[MAX],above[MAX];
void init()
{
for(int i=0;i<=30000;i++)
{
fa[i]
=i;
sum[i]
=1;
above[i]
=0;
}
}
int find(int x)
{
if(x==fa[x]) return x;
int tx=find(fa[x]);
above[x]
+=above[fa[x]];
fa[x]
=tx;
return tx;
}
void unio(int x,int y)
{
int tx=find(x);
int ty=find(y);
fa[ty]
=tx;
above[ty]
=sum[tx];
sum[tx]
+=sum[ty];
}
int main()
{
int p,x,y;
char str[5];
scanf(
"%d",&p);
init();
while(p--)
{
scanf(
"%s",str);
if(str[0]=='M')
{
scanf(
"%d%d",&x,&y);
unio(x,y);
}
else
{
scanf(
"%d",&x);
printf(
"%d\n",sum[find(x)]-above[x]-1);
}
}
return0;
}

  

posted @ 2011-09-04 16:53  Because Of You  Views(370)  Comments(0Edit  收藏  举报