记录编号 |
80751 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2002]银河英雄传说 |
最终得分 |
100 |
用户昵称 |
raywzy |
是否通过 |
通过 |
代码语言 |
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;
}