//=====================================
// KinderRiven POJ 1899
//=====================================
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 33333;
const int INF = 30000;
int fa[maxn]; //父亲结点的编号
int ret[maxn]; //压在i下面有几个木块
int size[maxn]; //以结点i为底的栈中元素的个数,如果i不是根,那么size[i] = 0;
void init(){
for(int i = 1; i <= INF; i++){ fa[i] = i; ret[i] = 0; size[i] = 1;}
}
int find_father(int u){
if(fa[u] != u){
int temp = fa[u];
fa[u] = find_father(fa[u]);
if(size[u]){ //size[i]不为0说明该元素为栈底的元素
ret[u] += size[temp];
size[temp] += size[u];
size[u] = 0;
}
else //否则的话这个元素就是一个普通的元素
ret[u] += ret[temp];
}
return fa[u];
}
void union_set(int p,int q){
int fp = find_father(p);
int fq = find_father(q);
fa[fp] = fq;
find_father(p); find_father(q);
return;
}
int main(){
int n;
init();
scanf("%d",&n);
while(n--){
char op[10];
scanf("%s",op);
if(op[0] == 'M'){
int x,y;
scanf("%d%d",&x,&y);
union_set(x,y);
}
else{
int x;
scanf("%d",&x);
find_father(x);
printf("%d\n",ret[x]);
}
}
return 0;
}
【POJ-1988】Cube Stacking(并查集)
最新推荐文章于 2021-10-12 16:54:22 发布