pku 1988 Cube Stacking(并查集扩展)

 

这道题自己想了很久,一直不敢下手。

用并查集来做,题目中的每个stack 对应一个集合。

parent[] ,根节点存储树的子节点数量sum ,非根结点存储父节点。

up[i] ,存储结点i 到父节点的距离。路径压缩后,父节点即根节点,则输出结果为count[i]=sum-up[i]-1

当把stack A 放到stack B 上面的时候,做集合的Union() 操作, 把集合B 并到集合A 中:

up[B]=-parent[A];parent[A]+=parent[B];parent[B]=A   ;

 

#include <iostream> using namespace std; int up[30001]; int parent[30001]; int Find(int x) { int temp=parent[x]; if(parent[x]<0) return x; parent[x]=Find(parent[x]);//路径压缩 up[x]+=up[temp];//更新up return parent[x]; } void Union(int a,int b) { a=Find(a); b=Find(b); if(a!=b) { up[b]=-parent[a]; parent[a]+=parent[b]; parent[b]=a; } } int main() { memset(up,0,sizeof(up)); memset(parent,0xff,sizeof(parent)); int m,first,second; char oper; scanf("%d/n",&m); for(int i=0;i<m;i++) { scanf(" %c",&oper); if(oper=='M') { scanf("%d%d",&first,&second); Union(first,second); } else { scanf("%d",&first); printf("%d/n",-parent[Find(first)]-up[first]-1); } } return 0; }  

 

你可能感兴趣的:(pku 1988 Cube Stacking(并查集扩展))