POJ 1988 Cube Stacking 带权并查集
2016-07-25 22:53
417 查看
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 23568 Accepted: 8258 Case Time Limit: 1000MS Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes labeled 1 through N. They start with N stacks, each containing a single cube. Farmer John asks Betsy to perform P (1<= P <= 100,000) operation. There are two types of operations: moves and counts. * In a move operation, Farmer John asks Bessie to move the stack containing cube X on top of the stack containing cube Y. * In a count operation, Farmer John asks Bessie to count the number of cubes on the stack with cube X that are under the cube X and report that value. Write a program that can verify the results of the game. Input * Line 1: A single integer, P * Lines 2..P+1: Each of these lines describes a legal operation. Line 2 describes the first operation, etc. Each line begins with a 'M' for a move operation or a 'C' for a count operation. For move operations, the line also contains two integers: X and Y.For count operations, the line also contains a single integer: X. Note that the value for N does not appear in the input file. No move operation will request a move a stack onto itself. Output Print the output from each of the count operations in the same order as the input file. Sample Input 6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4 Sample Output 1 0 2 Source USACO 2004 U S Open
来源: http://poj.org/problem?id=1988
#include <cstdio> using namespace std; #define MAXN 30000+500 struct LNode { int father; int Len_root; //到父亲的距离 int num; //如果是根节点的话,集合元素个数 int ancestor; //祖先 }Animals[MAXN]; void Init(int n) { for (int i = 1;i <= n;i++) { LNode &Ani = Animals[i]; Ani.ancestor = Ani.father = i; Ani.Len_root = 0; //距离自身为0 Ani.num = 0; //后续元素个数为0 } } int Len(int x,int ance) { if(x==ance) return 0; else return Animals[x].Len_root + Len(Animals[x].father,ance); } int Find(int x) { LNode &Ani = Animals[x]; if (Ani.ancestor == x) return x; else { int Real_ance = Find(Ani.ancestor); Ani.ancestor = Real_ance; //路径压缩1 Ani.Len_root = Len(x,Real_ance); Ani.father = Real_ance; //路径压缩2 Ani.num = Animals[Real_ance].num - Ani.Len_root; return Ani.ancestor; } } void Unite(int x,int y,int Rx_y = 1) //Y->X { int X = Find(x), Y = Find(y); if (X == Y) return; LNode &YL = Animals[Y]; YL.father = YL.ancestor = X; LNode &XL = Animals[X]; YL.Len_root = ++XL.num; XL.num += YL.num; } int main(void) { //freopen("F:\\test.txt","r",stdin); int P;char None[200]; scanf("%d",&P); gets(None); Init(30000);char order; for(int i=1,a,b;i<=P;i++) { scanf("%c",&order); if(order == 'M') { scanf("%d %d",&a,&b); Unite(a,b); } else { scanf("%d",&a);Find(a); printf("%d\n",Animals[a].num); } gets(None); } }
相关文章推荐
- 从0开始学习 GitHub 系列之「Git 进阶」
- RobotArt机器人离线编程软件
- iptables使用介绍
- 解决mac下adb无法找到手机
- jquery选择器优化
- 红黑树和平衡二叉树 区别
- 我面试到底问什么?
- ORACLE的数据字典表和动态性能视图
- 文章标题
- sdut oj2121 数据结构实验之链表六:有序链表的建立
- 自学编程这几点非常重要
- linux 关于数据库的部分命令
- Java并发编程:Callable、Future和FutureTask
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
- 私有composer包管理服务器搭建
- 安卓动画总结【非原创】
- Linux中常用操作命令
- javaweb学习总结三(枚举)
- 设计模式之观察者模式
- 1-UNIX System Overview