poj 1988 Cube Stacking(带权并查集)

题目:poj 1988 Cube Stacking(带权并查集)


题目大意:给出n个方块,然后执行操作, M x y 就是将这个x那一堆 移到 y的上方。然后c X 就是问x下方有对少方块。


解题思路:根节点记录下它的下方有多少个方块,然后这个集合里的每个方块都有权值,代表这个方块距离根之间有多少的方块。这样查讯到这个节点的时候就只要将根节点的个数减去权值 就得到答案 ( + 1 或不加1 看权值如何给定)。


代码:

#include <stdio.h>

const int N = 30005;

int p, f[N], c[N], num[N];

void init () {

	for (int i = 0; i < N; i++) {

		f[i] = i;
		c[i] = 0;
		num[i] = 1;
	}
}

int getfather (int x) {

	if ( x != f[x]) {

		int t = f[x];
		f[x] = getfather (f[x]);
		c[x] =  c[x] + c[t];

	}
	return f[x];
}

void unions (int p , int q) {

	f[p] = q;
	c[p] = num[q];
	num[q] += num[p];

}

int main () {
	
	scanf ("%d", &p);
	char s[10];
	int x, y;
	init ();
	while (p--) {

		scanf ("%s", s);
		if (s[0] == 'M') {

			scanf ("%d%d", &x, &y);
			int q = getfather (x);
			int p = getfather (y);
//			printf ("%d %d\n", q, p);
			if (p != q) 
				unions (p, q);

		} else {

			scanf ("%d", &x);
			int q = getfather (x);
//			printf ("%d %d\n", num[q], c[x]);
			printf ("%d\n", num[q] - c[x] - 1);
		}
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值