您的位置:首页 > 产品设计 > UI/UE

HDU 2818 Building Block【并查集+根节点偏移量】

2015-03-24 20:56 369 查看
大意:有30000个木块一次在一条线上排开 现在有两种操作 一种是把a木块所在的木块堆全部放到b木块堆的上面

一种是 查询a木块底下有多少块

分析:并查集 偏移量代表相对于根节点的偏移量

一下为根方便建立 然后对于一个下根 用一个数组表示其最顶端的是什么

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 30005;

int fa[maxn];
int num[maxn];
int di[maxn];

void init(int n) {
for(int i = 0; i <= n; i++) {
fa[i] = i;
num[i] = 0;
di[i] = i;
}
}

int Find(int x) {
if(x == fa[x]) return fa[x];
int fax = fa[x];
fa[x] = Find(fa[x]);
num[x] = num[x] + num[fax];
return fa[x];
}

int main() {
int n;
char a; int x, y;
while(EOF != scanf("%d",&n) ) {
init(30000);
while(n--) {
scanf("\n%c",&a);
if(a == 'M') {
scanf("%d %d",&x, &y);
int xx = Find(x); int yy = Find(y);
Find(di[xx]); Find(di[yy]);
//        printf("%d %d %d %d id = %d %d\n", x, y, xx, yy, di[xx], di[yy]);
if(xx != yy) {
fa[xx] = yy;
num[xx] = num[di[yy]] + 1;
di[yy] = di[xx];
}
} else {
scanf("%d",&x);
int z = Find(x);
printf("%d\n", num[x]);
}
}
}
return 0;
}


View Code
有一点需要注意的是 每次更新完都要进行更新 要不可能会出现这次更新的不会对上次产生影响 也就是第38行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: