poj.1988并查集-路径压缩、更新结点(偏移量)

本文介绍了一种使用并查集与路径压缩解决盒子移动问题的方法。通过定义偏移量来表示子节点与根节点的距离,并利用son数组记录每个节点下方的盒子数量。这种方法可以有效地解决读取操作中询问特定盒子下方盒子数量的问题。

题目描述很简单就是有N个盒子,标号分别为1-N,现有两种操作,一种是移动,将包含x的整体方块移到包含y的整体方块的上方,注意是整体移动,另一种为读取操作,输出在x下方方块的个数,那么对于这题感觉就是并查集路径压缩以及更新结点的典型,我们定义一个偏移量代表子节点与根节点的距离,然后定义一个son数组代表x下方的结点的个数,这样用根节点的son--所求结点的偏移量-1 就是x下方的方块数量了:下面是代码:

#include <stdio.h>
#include <stdlib.h>
#define Max 30001
int pre[Max];
int son[Max];
int set[Max];
int find(int x){
	if(x==set[x])
		return x;
	int temp=set[x];
	set[x]=find(set[x]);
	pre[x]+=pre[temp];
	return set[x];
}
int p;
int main()
{
	scanf("%d",&p);
	for(int i=1;i<Max;i++){
		pre[i]=0;
		son[i]=1;
		set[i]=i;
	}
	int a,b,c,x,y;
	while(p--){
	    getchar();
		if(getchar()=='M'){
			scanf("%d%d",&a,&b);
			x=find(a);
			y=find(b);
				set[y]=x;
				pre[y]=son[x];
				son[x]+=son[y];
		}
		else{
			scanf("%d",&c);
			printf("%d\n",son[find(c)]-pre[c]-1);
		}
	}
	return 0;
}

			
			
		
		
	


 

注意要更新结点的偏移量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值