您的位置:首页 > 其它

poj 1988 Cube Stacking 并查集

2011-05-03 20:14 441 查看
题意:两种操作: move : 将包含X的stack 至于包含Y的stack的栈顶.

count:计数X所在stack的X的下面cube的数量.

思路:运用并查集.以栈底为根节点,parent[i]表示i的父节点,num[i]表示i 所在集合cube数量,rank[i]表示i 的度,即i下的cube的数量.

合并操作的时候,parent[x] = y(x放y之上).x下面增加了包含y的集合,所以x的度rank[x] 累加 num[y].同时以y为根节的集合,增加了包含x的集合.所以,num[y]累加num[x] . 查找操作的时候,找到一次x的父节点,对x的度都应更新.

详见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int parent[30001],rank[30001],num[30001];
int p;
void make_set()
{
int i;
for(i=0; i<=30000; i++)
{
parent[i] = i;
num[i] = 1;
rank[i] = 0;
}
}
int find_set(int x)
{
int tmp = parent[x];
if(x != parent[x])
{
parent[x] = find_set(parent[x]);
rank[x] += rank[tmp];
}
return parent[x];
}
void union_set(int x, int y)
{
x = find_set(x);
y = find_set(y);
if(x == y)
return;
parent[x] = y;
rank[x] += num[y];
num[y] += num[x];
}

int main(void)
{
make_set();
scanf("%d",&p);
getchar();
char ch;
while(p--)
{
int x,y;
scanf("%c",&ch);
if(ch == 'M')
{
scanf("%d%d",&x,&y);
union_set(x,y);
}
else
{
scanf("%d",&x);
find_set(x);
printf("%d/n",rank[x]);
}
getchar();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: