POJ 1988Cube Stacking
2013-08-06 11:49
323 查看
一开始这题完全没有想法,后来又看题解,不懂...慢慢磨了两天左右,终于写出来了。
并查集的题,由于要输出当前标号方块下面的方块数,需要处理下。每次更新当前根节点下方块数目P为目标栈中方块数R,更新目标栈中方块数,合并栈。
查询时找出当前方块所有根节点的下方方块数P,记录下总和即为输出数据,同时将查询点根节点直接更新为当前栈最下方的根节点。当前点下方方块数目为输出的总和。此处不更新将超时
附代码
并查集的题,由于要输出当前标号方块下面的方块数,需要处理下。每次更新当前根节点下方块数目P为目标栈中方块数R,更新目标栈中方块数,合并栈。
查询时找出当前方块所有根节点的下方方块数P,记录下总和即为输出数据,同时将查询点根节点直接更新为当前栈最下方的根节点。当前点下方方块数目为输出的总和。此处不更新将超时
附代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define max(a,b) ((a)>(b)?(a):(b)) int root[30005]; int pos[30005]; int r[30005]; void init (int n) { int i; for(i=0; i<n; i++) { root[i]=i; pos[i]=0; r[i]=1; } } int find(int x) { if(x==root[x])return x; else return find(root[x]); } int main() { int n,x,y,sum,i; char c[2]; while(scanf("%d",&n)!=EOF) { init (30004); while(n--) { scanf("%s",c); if(c[0]=='M') { scanf("%d%d",&x,&y); pos[find(x)]=r[find(y)]; r[find(y)]=r[find(y)]+r[find(x)]; root[find(x)]=find(y); } else { scanf("%d",&x); sum=0; i=x; while(root[x]!=x) { sum=sum+pos[x]; x=root[x]; } root[i]=x; pos[i]=sum; printf("%d\n",sum); } } } return 0; }
相关文章推荐
- POJ-1988-Cube Stacking
- POJ 1988 Cube Stacking
- poj-1988-Cube Stacking (并查集)
- poj 1988 Cube Stacking
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking 带权并查集
- poj 1988 Cube Stacking 并查集
- POJ 1988 Cube stacking
- POJ 1988 Cube stacking
- POJ 1988 Cube Stacking【带权并查集】
- POJ 1988 Cube Stacking
- poj 1988 Cube Stacking
- 【35.12%】【POJ 1988】Cube Stacking
- POJ 1988 Cube Stacking 并查集
- poj 1988 - Cube Stacking(并查集)
- POJ 1988 Cube Stacking(并查集+路径压缩)
- POJ--1988--Cube Stacking
- poj 1988 Cube Stacking
- poj 1988 Cube Stacking (并查集)