【ybt】【图论 并查集 课过 例3】银河英雄传说

银河英雄传说

题目链接:银河英雄传说


题目描述

在这里插入图片描述

解题思路

我们可以用 n u m num num 表示当前序列有多战舰, a a a 表示当前战舰前面还有多少战舰。

那么当 i i i 转移到 j j j 后面时,就应该有如下操作:

int fx=fd(x),fy=fd(y);
fa[fx]=fy;
a[fx]=num[fy];
num[fy]+=num[fx];

这个不难理解,自己推一下。

code

#include<iostream>
#include<cstdio>
using namespace std;

int T;
int a[30010];
int fa[30010];
int num[30010];

int abs(int t)
{
	if(t>0)
		return t;
	return -t;
}

int fd(int now)
{
	if(fa[now]==now)
		return now;
	int t=fd(fa[now]);
	a[now]+=a[fa[now]];
	return fa[now]=t;
}

int main()
{
	cin>>T;
	for(int i=1;i<=30000;i++)
		fa[i]=i,num[i]=1;
	while(T--)
	{
		char c;
		int x,y;
		cin>>c;
		scanf("%d%d",&x,&y);
		int fx=fd(x),fy=fd(y);
		if(c=='M')
		{
			fa[fx]=fy;
			a[fx]=num[fy];
			num[fy]+=num[fx];
		}
		else
		{
			if(fx==fy)
				cout<<abs(a[y]-a[x])-1<<endl;
			else
				cout<<-1<<endl;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值