记录编号 118860 评测结果 AAAAAAAAAA
题目名称 [NOI 2002]银河英雄传说 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 1.200 s
提交时间 2014-09-09 22:28:07 内存使用 0.59 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
using namespace std;
typedef long long LL;
typedef unsigned int Uint; 
const int INF=0x7fffffff;
//==============struct declaration==============

//==============var declaration=================
const int MAXN=30010;
int k,s,e;  
char cmd;
int root[MAXN],dist[MAXN],len[MAXN];
//==============function declaration============
void move(int i,int j);
void query(int i,int j);
int findr(int x);
int getdist(int x);
//==============main code=======================
int main()
{  
  string FileName="galaxy";//程序名 
  string FloderName="COGS";//文件夹名 
  freopen((FileName+".in").c_str(),"r",stdin);
  freopen((FileName+".out").c_str(),"w",stdout);
#ifdef DEBUG  
  system(("cp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\standard.cpp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\submit.txt").c_str());
#endif    
ios::sync_with_stdio(false);
  cin>>k;
  For(i,1,MAXN)
  {
    root[i]=i;
    len[i]=1;
    dist[i]=0;
  }
  while (k--)
  {
    cin>>cmd>>s>>e;
    if (cmd=='M')
      move(s,e);
    else if (cmd=='C')
      query(s,e);
    else
      pritnf("Init Error: %c\n",cmd);
  } 
  return 0;
}
//================fuction code====================
void move(int i,int j)//将i移到j末尾 
{
   int fi=findr(i);
   int fj=findr(j);
   root[fi]=fj;
   dist[fi]=len[fj];
   len[fj]+=len[fi];
}
int findr(int x)
{
  if (root[x]==x)
  {
    dist[x]=0;
    return x;
  }
  int rootf=findr(root[x]);
  dist[x]+=dist[root[x]];
  root[x]=rootf;
  return root[x];
}
void query(int i,int j)
{
  if (findr(i)!=findr(j))
    pritnf("-1\n");
  else
  {
    int d1=getdist(i);
    int d2=getdist(j);
    pritnf("%d\n",abs(d1-d2)-1);
  }
}
int getdist(int x)
{
   if (root[x]==x)
     return 0;
   return dist[x]+getdist(root[x]);
}