带权并查集模板2(银河英雄传说)

这道题有30000个列。。。

所以说带权并查集在原模板的基础上就必须再添一个num数组,num[i]表示i队列的长度

算是涨了见识了。。。

code:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int fa[30005],val[30005],num[30005];
int find(int x)
{
	if(fa[x]!=x)
	{
		int t=fa[x];
		fa[x]=find(fa[x]);
		val[x]+=val[t]; 
	}
	return fa[x];
}
int main()
{
	int T;
	scanf("%d",&T);
	for(int i=1;i<=30000;i++)
	{
		fa[i]=i;
		num[i]=1;
	}
	char pd;
	int x,y;
	while(T--)
	{
		cin>>pd;
		scanf("%d%d",&x,&y);
		if(pd=='M')
		{
			int px=find(x);
			int py=find(y);
			if(px!=py)
			{
			fa[px]=py;
			val[px]+=num[py];
			num[py]+=num[px];
			num[px]=0;
			}
			//printf("qwq\n");
		}
		else
		if(pd=='C')
		{
			int px=find(x);
			int py=find(y);
			if(px!=py)
			{
				printf("-1\n");
			}
			else
			{
				int tmp;
				tmp=abs(val[y]-val[x]);
				printf("%d\n",tmp-1);
			}
			
		}
	}
	return 0;
	
} 
posted @ 2019-07-29 17:12  ShineEternal  阅读(181)  评论(0编辑  收藏  举报