2018.09.27【NOI2002】【洛谷P1196】银河英雄传说(带权并查集)

本文深入探讨了带权并查集算法的实现细节,通过一个具体的编程问题,介绍了如何使用并查集来解决涉及节点间距离计算的问题。文章提供了完整的代码示例,包括初始化、查找和合并操作,以及如何更新节点间的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门


解析:

带权并查集裸题啊。

我们用一个 l a s t last last记录根到最远的节点的距离,合并一下就好了。


代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define _debug(x) cerr<<#x<<" : "<<x<<endl
inline
int getint(){
	re int num;
	re char c;
	while(!isdigit(c=gc()));num=c^48;
	while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
	return num;
}

inline
void outint(int a){
	static char ch[13];
	if(a==0)pc('0');
	while(a)ch[++ch[0]]=a-a/10*10,a/=10;
	while(ch[0])pc(ch[ch[0]--]^48);
}

inline
char getalpha(){
	re char c;
	while(!isalpha(c=gc()));
	return c;
}

cs int N=30002;
int fa[N],dep[N],last[N];
inline
int getfa(int x){
	if(x==fa[x])return x;
	int tmp=getfa(fa[x]);
	dep[x]+=dep[fa[x]];
	return fa[x]=tmp;
}

inline
void init(){
	for(int re i=1;i<=30000;++i){
		fa[i]=i;
		dep[i]=0;
		last[i]=1;
	}
}

int T;
signed main(){
	init();
	T=getint();
	while(T--){
		char op=getalpha();
		int i=getint(),j=getint();
		int fi=getfa(i),fj=getfa(j);
		switch(op){
			case 'M':{
				if(fi==fj)continue;
				fa[fi]=fj;
				dep[fi]=last[fj];
				last[fj]=last[fj]+last[fi];
				break;
			}
			case 'C':{
				if(fi!=fj)puts("-1");
				else outint(abs(dep[i]-dep[j])-1),pc('\n');
				break;
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值