HDU 2818 Building Block【并查集+根节点偏移量】
2015-03-24 20:56
369 查看
大意:有30000个木块一次在一条线上排开 现在有两种操作 一种是把a木块所在的木块堆全部放到b木块堆的上面
一种是 查询a木块底下有多少块
分析:并查集 偏移量代表相对于根节点的偏移量
一下为根方便建立 然后对于一个下根 用一个数组表示其最顶端的是什么
代码:
View Code
有一点需要注意的是 每次更新完都要进行更新 要不可能会出现这次更新的不会对上次产生影响 也就是第38行
一种是 查询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行
相关文章推荐
- HDU 2818 Building Block【并查集+根节点偏移量】
- HDU 2818 Building Block【并查集+根节点偏移量】
- hdu 2818 Building Block (并查集)(根据父节点来更新)
- hdu 2818 Building Block(加权并查集)
- hdu 2818 Building Block(带权并查集)
- hdu 2818 Building Block (并查集)
- HDU 2818 Building Block 带权并查集
- HDU 2818 Building Block(带权并查集)
- HDU 2818 Building Block 加权并查集
- hdu 2818 Building Block 并查集(边搜索边更新)
- HDU 2818 Building Block 带权并查集
- hdu 2818 Building Block【基础带权并查集】
- ?HDU 2818 Building Block 求大神讲解 (并查集)
- hdu 2818 Building Block(并查集,输出一元素下边有多少)
- hdu-2818-Building Block-带权并查集
- hdu 2818 Building Block(带权并查集)
- hdu 2818 Building Block(并查集)
- hdu 2818 Building Block(并查集)
- hdu 2818 Building Block 并查集 路径压缩
- POJ 1988 Cube Stacking || HDU 2818 Building Block 带权并查集