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的度都应更新.
详见代码:
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; }
相关文章推荐
- poj 1988 Cube Stacking(数据结构:带权并查集)
- [POJ 1988] Cube Stacking (带值的并查集)
- poj 1988 Cube Stacking 并查集的应用
- POJ 1988 CUBE STACKING(并查集)
- POJ1988:Cube Stacking(并查集)
- POJ 1988 Cube Stacking(带权并查集)
- HDU 2818 Building Block, poj 1988 Cube Stacking(带权并查集)
- POJ 1988 Cube Stacking 带权并查集
- POJ 1988 Cube Stacking || HDU 2818 Building Block 带权并查集
- POJ 1988 Cube Stacking (带权并查集)
- POJ 1988 Cube Stacking(带权并查集)
- POJ 1988 Cube Stacking (并查集)
- POJ1988 Cube Stacking(并查集)
- 【北大夏令营笔记-并查集】poj1988-Cube Stacking
- POJ 1988 Cube Stacking(并查集)
- poj 1988(并查集)Cube Stacking
- POJ-1988 Cube Stacking (加权并查集)
- POJ1988 - Cube Stacking - 并查集
- POJ 1988 Cube Stacking(带权并查集)#by zh
- (用树结构支持并查集8.2.2)POJ 1988 Cube Stacking(并查集的使用:判断一个集合中元素的个数---->>某一个元素的下面还有多少个元素)