带权并查集模板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;
	
} 
作者&出处:ShineEternal
本文阅读完毕欢迎到此留言:link
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
你看地这么津津有味,不点个赞再走吗QAQ

                
            
        
浙公网安备 33010602011771号