poj 1988 并查集 搬箱子的问题
2012-02-29 22:26
288 查看
题意:输入N,代表了有N个箱子,没个箱子可以看作是一个“栈”,M后面的a b 操作是把a箱子所在的栈中的箱子,整体放到b箱子所在的栈的顶部,画画图就懂了。C后面的数字是判断这个箱子的下面还有几个箱子
思路:并查集。
思路:并查集。
#include<iostream> using namespace std; struct node { int parent;//父亲节点 int count;//元素下的个数 int rank;//所在集合中的个数 }e[30100]; void make_set() { for(int i=1;i<=30099;i++) { e[i].parent=i; e[i].count=0; e[i].rank=1; } } int find_set(int x) { if(x==e[x].parent) return x; else { int t=e[x].parent; e[x].parent=find_set(t); e[x].count+=e[t].count;//比如2放到4上面,因为并集中2的父亲节点是4,所以应该这样累加。 } return e[x].parent; } void join(int x,int y) { int r1,r2; r1=find_set(x); r2=find_set(y); e[r1].parent=r2; e[r1].count+=e[r2].rank;//精华所在 e[r2].rank+=e[r1].rank; e[r1].rank=0;//感觉应该清零,但是不清零也AC } int main() { int P; char c[2]; int a,b,t; scanf("%d",&P); make_set(); while(P--) { scanf("%s",c); { if(c[0]=='M') { scanf("%d%d",&a,&b); join(a,b); } else if(c[0]=='C') { scanf("%d",&t); find_set(t);//这里要是不查一次的话一直WA,不太理解 printf("%d\n",e[t].count); } } } //system("pause"); }
相关文章推荐
- Cube Stacking POJ - 1988 并查集
- poj 1988(并查集)
- POJ 1988 Cube Stacking 并查集
- POJ 1988 Cube Stacking 并查集
- poj 1988 Cube Stacking (并查集)
- HDU 2818 Building Block, poj 1988 Cube Stacking(带权并查集)
- poj1988_并查集
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- poj 2524 Ubiquitous Religions 并查集问题
- POJ-1988 Cube Stacking (加权并查集)
- poj 1988 Cube Stacking(带权并查集)
- poj1988(并查集)
- poj1988 并查集+路径压缩
- POJ 1988 Cube Stacking (带权并查集)
- poj并查集问题-2524
- poj 1988 并查集
- poj-1988-Cube Stacking (并查集)
- POJ 1703 Find them, Catch them 并查集 (关系问题 判断是否在一个集合)
- poj1988 权值并查集
- POJ 1988 Cube Stacking (带权并查集)