poj 1988 Cube Stacking 题意:和银河英雄传说类似,可以参考黑书 其实题目并不难,最开始没想到可以存储上面有多少个。想到直接去求下面有少个,发现好像很暴力。 /* * File: main.cpp * Author: Mi * * Created on 2011年6月19日, 下午8:55 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <map> #include <vector> #include <stdlib.h> #include <queue> #include <stack> #include <string> #define N 100005 using namespace std; /* * */ int father[N]; int up[N]; int down[N]; void Make_set(int n) { for(int i=0;i<=n;i++) { father[i]=i;//根节点 up[i]=0;//保存i上面有多少个方块 down[i]=1;//保存根节点上总共有多少个方块,最后答案就是dows-up-1 } } int Find(int x)//在路径压缩时向上传递更新up的值 { if(x!=father[x]) { int temp=father[x]; father[x]=Find(father[x]); up[x]+=up[temp]; } return father[x]; } void Union(int x,int y) { int rootx=Find(x),rooty=Find(y); father[rooty]=rootx;//把y接在x的根节点的后面 up[rooty]+=down[rootx];//更新up[rooty] down[rootx]+=down[rooty]; } int main(int argc, char** argv) { int p; scanf("%d",&p); Make_set(N); while(p--) { char str[2]; scanf("%s",str); if(str[0]=='M') { int x,y; scanf("%d%d",&x,&y); // printf("%d %d/n",Find(x),Find(y)); Union(x,y); } else { int x; scanf("%d",&x); printf("%d/n",down[Find(x)]-up[x]-1); } } return 0; }