POJ 1988 Cube Stacking(并查集+路径压缩)
2015-08-22 19:54
441 查看
题目链接:POJ 1988 Cube Stacking
并查集的题目
【题目大意】
有n个元素,开始每个元素自己 一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈。第二种操作是询问含有x元素下面有多少个元素。
用sum数组储存每个栈中的元素个数,每次合并的时候将sum加到 父亲节点,也就是每个栈的最底部。
用under数组储存当前节点下面有多少元素。每次合并的时候,就可以将顶端元素的under赋值为父节点也就是栈最底部的sum。
在查询的时候,运用递归的思想,从底部往上加under。
【源代码】
并查集的题目
【题目大意】
有n个元素,开始每个元素自己 一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈。第二种操作是询问含有x元素下面有多少个元素。
用sum数组储存每个栈中的元素个数,每次合并的时候将sum加到 父亲节点,也就是每个栈的最底部。
用under数组储存当前节点下面有多少元素。每次合并的时候,就可以将顶端元素的under赋值为父节点也就是栈最底部的sum。
void Union(int x,int y){ int xr = find(x); int yr = find(y); if(xr==yr) return; father[xr]=yr; under[xr]=sum[yr]; sum[yr]+=sum[xr]; }
在查询的时候,运用递归的思想,从底部往上加under。
int find(int x){ if(x==father[x]) return father[x]; int tmp = find(father[x]); under[x]+=under[father[x]]; //仔细想想 father[x]=tmp; return tmp; }
【源代码】
#include <iostream> //父亲节点在栈的底部
#include <cstdio>
using namespace std;
const int maxn = 30000+10;
int father[maxn];
int under[maxn];
int sum[maxn];
void init(){
for(int i=0;i<maxn;i++){
father[i]=i;
under[i]=0;
sum[i]=1;
}
}
int find(int x){
if(x==father[x])
return father[x];
int tmp = find(father[x]);
under[x]+=under[father[x]];
father[x]=tmp;
return tmp;
}
void Union(int x,int y){ int xr = find(x); int yr = find(y); if(xr==yr) return; father[xr]=yr; under[xr]=sum[yr]; sum[yr]+=sum[xr]; }
int main(){
int n;
while(scanf("%d",&n)!=EOF){
char ch;
int a,b;
init();
for(int i=0;i<n;i++){
scanf(" %c",&ch);
if(ch=='M'){
scanf("%d%d",&a,&b);
Union(a,b);
}
else{
scanf("%d",&a);
int x=find(a); //只是用来累加一下under
printf("%d\n",under[a]);
}
}
}
return 0;
}
相关文章推荐
- 如何用PHP通过拼接数据到显示在数据库图表上
- Razor模板引擎
- Sublime Text Package Control
- 欢迎使用CSDN-markdown编辑器
- 大龄屌丝自学笔记--Java零基础到菜鸟--008
- oracle脚本执行多条语句报错
- js怎么判断一个对象是文本框(text)还是下拉框(select)
- bash的配置文件以及加载的顺序
- 网易电面-静态库与动态库
- USBDM Debugger interface for Freescale RS08,HCS08,HCS12,Coldfire and ARM-Kinetis Devices.
- 操作系统也谈"算法"
- 查看网卡信息及状态和网卡日志信息
- HDU 4348 To the moon
- Java--线程
- 微信公众平台服务号如何申请
- 网页显示UIWebView(一个)
- 安卓开发颜色代码
- Python3.X 抓取网络资源
- 有向图中两个结点之间是否存在一条路径
- #import与@class区别