记录编号 80751 评测结果 AAAAAAAAAA
题目名称 [NOI 2002]银河英雄传说 最终得分 100
用户昵称 Gravatarraywzy 是否通过 通过
代码语言 C++ 运行时间 0.681 s
提交时间 2013-11-07 16:08:47 内存使用 2.30 MiB
显示代码纯文本
/*并查集练手*/
#include<fstream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int father[30001];
int SUM[30001];//记录除i以外的上面舰艇数
int P[30001];//记录一个并查集中的所有舰艇数
int getfather(int v)
{
	if(father[v]!=v)
	{
		int t=father[v];
		father[v]=getfather(father[v]);
		SUM[v]+=SUM[t];
	}
	return father[v];
}
bool judge(int x,int y)
{
	if(getfather(x)==getfather(y))
		return 1;
	return 0;
}
void HB(int x,int y)
{
	int a,b;
	a=getfather(x);
	b=getfather(y);
	if(a==b) return; father[a]=b;SUM[a]=P[b];P[b]+=P[a];
}
int main()
{
	freopen("galaxy.in","r",stdin);
    freopen("galaxy.out","w",stdout);
	int i,A,B; bool K=0;
	char temp='A';
	for(i=1;i<=30000;i++)
	{
		father[i]=i;
		SUM[i]=0;
		P[i]=1;
	}
	int n;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%c%c%d%d",&temp,&temp,&A,&B);
		if(temp=='M')
			HB(A,B);
		else
		{
			K=judge(A,B);
			if(K==0)
				printf("-1\n");
			else
			{
				printf("%d\n",abs(SUM[A]-SUM[B])-1);
				K=0;
			}
		}
	}
	return 0;
}