poj 1988 Cube Stacking
2011-07-22 14:55
337 查看
// 题意:有n个编号[1,n]的箱子,将每个箱子当做一个栈,有两种操作: // M a b: 表示将 编号为 a 的箱子所在的栈 放在 编号为 b 的箱子所在栈 的 栈顶 . // C a: 计算编号为a的所表示的栈中在a号箱子下面的箱子数目. #include <iostream> //并查集 using namespace std; #define maxn 30002 int p[maxn],num[maxn],under[maxn]; // num[i] 表示编号为i所在的集合(栈)的元素个数 // under[i] 表示编号为i的节点到其根节点的路径上的元素个数(除了它本身),即在它下方有多少个元素 // 注意根节点在栈底,而不是在栈顶,即栈中元素的父亲节点位于它下方 void init() { for(int i=1;i<maxn;++i) { p[i]=i; under[i]=0; num[i]=1; } } int find(int a) { if(p[a]!=a) { int t=p[a]; p[a]=find(p[a]); under[a]+=under[t]; //更新元素与新根节点的距离 } return p[a]; } // 将 编号为 a 的箱子所在的栈A 放在 编号为 b 的箱子所在栈B 的 栈顶 , // x ,y 分别是 栈A 和 栈B 的栈底元素,则 x 的根节点是 y void Union(int a,int b) { int x=find(a),y=find(b); p[x]=y; under[x]=num[y]; num[y]+=num[x]; } int main() { init(); int op; cin>>op; while(op--) { char ch[2]; int a,b; scanf("%s",ch); if(ch[0]=='M') { scanf("%d%d",&a,&b); Union(a,b); } else { scanf("%d",&a); find(a); printf("%d\n",under[a]); } } 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(数据结构:带权并查集)
- POJ1988 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/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
- POJ 1988 Cube Stacking
- poj-1988-Cube Stacking