【ybtoj】银河英雄传说

题目描述

【ybtoj】银河英雄传说_并查集
【ybtoj】银河英雄传说_数组_02

解题思路

这是带边权的并查集。用并查集维护战舰是否在同一列,以每一列的第一艘战舰作为集合代表,用一个dis数组记录边权。

Code

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, x, y, xx, yy, fa[50010], num[50010], dis[50010];
char c;
int find(int x) 
{
	if(fa[x]==x)
	 return x;
	int cnt=find(fa[x]);
	dis[x]=dis[fa[x]]+dis[x];
	fa[x]=cnt;
	return fa[x];
}
int main() 
{
	for(int i=1;i<=50000;i++)
	 fa[i]=i,num[i]=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) 
	{
		cin>>c;
		scanf("%d %d",&x,&y);
		xx=find(x),yy=find(y);
		if (c== 'M') 
		{
			fa[xx]=yy;
			dis[xx]=num[yy];
			num[yy]+=num[xx],num[xx]=0;
		} 
		else 
		{
			if(xx!=yy)
			 printf("-1\n");
			else
			 printf("%d\n",abs(dis[x]-dis[y])-1);
		}
	}
}


谢谢阅读

作者:基德不基,转载请注明原文链接