POJ1988(Cube Stacking)--并查集
题目链接:http://poj.org/problem?id=1988


#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<list>
#include<queue>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std; struct node
{
int parent;
int date;
}; int * total;
int * under; class DisJoinSet
{
protected:
int n; node * tree;
public:
DisJoinSet(int n);
~DisJoinSet();
void Init();
int Find(int x);
void Union(int x,int y);
}; DisJoinSet::DisJoinSet(int n)
{
this->n = n;
tree = new node[n+];
total = new int[n+];
under = new int[n+];
Init();
}
DisJoinSet::~DisJoinSet()
{
delete[] under;
delete[] total;
delete[] tree;
} void DisJoinSet::Init()
{
for(int i = ;i <= n ;i ++)
{
tree[i].date = i;
tree[i].parent = i;
total[i] = ;
under[i] = ;
}
}
int DisJoinSet::Find(int x)
{
//int temp = tree[x].parent;
if(x != tree[x].parent)
{
int par = Find(tree[x].parent);
under[x] += under[tree[x].parent];//把父亲结点下面的个数加到自己头上
tree[x].parent = par;
return tree[x].parent;
}
else
{
return x;
}
} void DisJoinSet::Union(int x,int y)
{
int pa = Find(x);
int pb = Find(y);
if(pa == pb)return ;
else
{
tree[pa].parent = pb;//x的根变为y的根 即把x所在的堆放在y所在的堆上面
under[pa] = total[pb];//pa下的数量即原来y所在栈里的元素total
total[pb] += total[pa];//更新y的totoal
}
} int main()
{
int p;
while(scanf("%d",&p) != EOF)
{
if(p == )break;
DisJoinSet dis(p);
char s1[];
for(int i = ;i < p ;i++)
{ int s2;
int s3;
scanf("%s",s1);
if(s1[] == 'M')
{
scanf("%d%d",&s2,&s3);
int pa = dis.Find(s2);
int pb = dis.Find(s3);
if(pa != pb)
{
dis.Union(s2,s3);
}
}
if(s1[] == 'C')
{
scanf("%d",&s2);
dis.Find(s2);
cout<<under[s2]<<endl;
}
}
dis.~DisJoinSet();
}
return ;
}
POJ1988(Cube Stacking)--并查集的更多相关文章
- poj.1988.Cube Stacking(并查集)
Cube Stacking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submi ...
- poj1988 Cube Stacking 带权并查集
题目链接:http://poj.org/problem?id=1988 题意:有n个方块,编号为1-n,现在存在两种操作: M i j 将编号为i的方块所在的那一堆方块移到编号为j的方块所在的那 ...
- POJ1988 Cube Stacking 【并查集】
题目链接:http://poj.org/problem?id=1988 这题是教练在ACM算法课上讲的一道题,当时有地方没想明白,现在彻底弄懂了. 题目大意:n代表有n个石头,M a, b代表将a石头 ...
- poj1988 Cube Stacking(并查集
题目地址:http://poj.org/problem?id=1988 题意:共n个数,p个操作.输入p.有两个操作M和C.M x y表示把x所在的栈放到y所在的栈上(比如M 2 6:[2 4]放到[ ...
- poj1988 Cube Stacking
并查集的高效之处在于路径压缩和延迟更新. 在本题中需要额外维护子树的规模以及当前子树节点到跟的距离两个数组. 由于一个新的数必然是两棵树拼接而成,对于子树规模的更新直接相加即可, 对于节点到跟的距离: ...
- POJ1988 Cube stacking(非递归)
n有N(N<=30,000)堆方块,开始每堆都是一个方块.方块编号1 – N. 有两种操作: nM x y : 表示把方块x所在的堆,拿起来叠放到y所在的堆上. nC x : 问方块x下面有多少 ...
- POJ 1988 Cube Stacking(并查集+路径压缩)
题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...
- POJ 1988 Cube Stacking( 带权并查集 )*
POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...
随机推荐
- JDK目录详解
bin目录: 该目录用于存放一些可执行程序. 如javac.exe(java编译器).java.exe(java运行工具),jar.exe(打包工具)和* javadoc.exe(文档生成工具)等. ...
- win7下docker环境安装
最近公司涉及到对docker容器引擎的使用,所以就在网上各种搜索,由于是win7系统,所以在使用上更是麻烦,遇到各种错误就是无法成功启动docker,经过两天的各种尝试下,终于安装成功,在此记录一下使 ...
- using 关键字有两个主要用途
转自:https://www.jianshu.com/p/5357dc4efcf8 using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二) ...
- 【Leetcode_easy】674. Longest Continuous Increasing Subsequence
problem 674. Longest Continuous Increasing Subsequence solution class Solution { public: int findLen ...
- iOS算法题
1兔子算法题 兔子可以跳一步2步或者3步,问跳到100有多少种跳法? // 兔子可以跳一步2步或者3步 // 问跳到100有几种跳法 /* 分析1 两个变量,X*2+Y*3=100. X最大为50,X ...
- OpenLayers 根据坐标动态画多边形
找了一上午,发现都是鼠标点击画框的,那为什么不标明了是 “鼠标”点击 呢? 想实现的功能是数据库检索坐标集合,然后根据分组提取4点坐标,最后把多个多边形形成图层放在地图上. 最后的实现: <!D ...
- 【计算机视觉】Objectness算法(一)---总体理解,整理及总结
1.源码下载及转换为VS2012 WIN32版本. http://www.cnblogs.com/larch18/p/4560690.html 2.原文: http://wenku.baidu.com ...
- ul根据后台添加li,并在点击li时,颜色随之变化
在我们大多数时候都是通过<ul><li>...</li></ul>来实现同级的加载,但是也用很多时候li里的内容是不固定的.需要根据后台返回数据来生成. ...
- SpringBoot中使用 RabbitMQ -测试
本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了 ...
- kolla安装Queens版本OpenStack(ceph后端)
OpenStack all-in-one部署: 本次部署为OpenStack Queens版本部署,使用All-in-one,单节点部署. 物理资源:8核,32GB,硬盘400GB(3个盘),2网卡. ...