记录编号 58565 评测结果 AAAAAAAAAA
题目名称 [NOI 2002]银河英雄传说 最终得分 100
用户昵称 Gravatardigital-T 是否通过 通过
代码语言 C++ 运行时间 0.814 s
提交时间 2013-04-22 20:14:27 内存使用 3.14 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
/*
ifstream fi("galaxy.in");
ofstream fo("galaxy.out");
*/
int T;
class set//并查集的集合C
{
public:
	int parent;
	int dis;//记录到最高点的距离即该集合中,这个元素之前有多少个元素
	int count;//表示该元素所在集合中元素的总个数
}C[30001];
void makeset(int x)//集
{
	C[x].parent=x;
	C[x].dis=0;
	C[x].count=1;
}
int findset(int x)
{
	if(C[x].parent==x)return x;
	int y=findset(C[x].parent);
	C[x].dis=C[x].dis+C[C[x].parent].dis;
	C[x].parent=y;
	return C[x].parent;
}
void merge(int x,int y)//并
{
	int a=findset(x),b=findset(y);
	C[a].parent=b;
	C[a].dis=C[b].count;
	C[b].count+=C[a].count;
}
int main()
{
	freopen("galaxy.in","r",stdin);
	freopen("galaxy.out","w",stdout);
	char ch;
	int c,d;
	scanf("%d",&T);//fi>>T;
	for(int i=1;i<=30000;i++)makeset(i);
	for(int i=1;i<=T;i++)
	{
		scanf("%c%c",&ch,&ch);
		scanf("%d%d",&c,&d);
		//fi>>ch>>c>>d;
		if(ch=='M')merge(c,d);
		else 
		{
			if(findset(c)==findset(d))printf("%d\n",(int)abs(C[c].dis-C[d].dis)-1);//fo<<abs(C[c].dis-C[d].dis)-1<<endl;
			else printf("-1\n");//fo<<"-1"<<endl;
		}
	}
	return 0;
}