poj 1988 Cube Stacking 并查集的应用

这道题目题意是有有两种操作1、是将x移动到y的stack顶部。2、计数在x的stack中,在x之下的的cube个数。

主要思想是用arr[i]表示父亲节点,d[i]表示i之下有几个节点,s[i]表示以i为根的树共有几个节点。

在执行M时是直接找到a,b的父节点,然后合并,执行C时是查找答案。

#include<stdio.h>
#include<String.h>
#define maxn 300005
int p;
int arr[maxn],re[maxn],rank[maxn];
int find(int x)
{
	if(arr[x]==x)
		return x;
	int temp =arr[x];
	arr[x]=find(arr[x]);
	rank[x]+=rank[temp];
	return arr[x];
}
void merge(int x, int y)
{
	x=find(x);
	y=find(y);
	arr[x]=y;
	rank[x]+=re[y];
	re[y]+=re[x];
	re[x]=0;
}
int main()
{
	int i,a,b;
	char ch[5];
	for(i=1;i<=maxn;i++)
	{
		re[i]=1;
		rank[i]=0;
		arr[i]=i;
	}
	scanf("%d",&p);
	for(i=1;i<=p;i++)
	{
		scanf("%s",&ch);
		//getchar();
		if(ch[0]=='M')
		{
			scanf("%d%d",&a,&b);
			merge(a,b);
		}
		if(ch[0]=='C')
		{
			scanf("%d",&a);
			find(a);
			printf("%d\n",rank[a]);
		}
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值