标签:
★★☆ 输入文件:galaxy.in
输出文件:galaxy.out
简单对比
时间限制:5 s 内存限制:128 MB
【样例说明】
第一列 | 第二列 | 第三列 | 第四列 | ||
---|---|---|---|---|---|
初始时 | 1 | 2 | 3 | 4 | …… |
M 2 3 | 1 | 3 2 |
4 | …… | |
C 1 2 | 1号战舰与2号战舰不在同一列,因此输出-1 | ||||
M 2 4 | 1 | 4 3 2 |
…… | ||
C 4 2 | 4号战舰与2号战舰之间仅布置了一艘战舰,编号为3,输出1 |
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=50010; 6 int fa[maxn],sz[maxn],rank[maxn]; 7 char op[20]; 8 int q[maxn],tot; 9 int Find(int x,int &rt){ 10 rt=x;tot=0; 11 while(fa[rt]!=rt){ 12 q[++tot]=rt; 13 rt=fa[rt]; 14 } 15 int sum=1; 16 while(tot){ 17 sum+=rank[q[tot]]-1; 18 rank[q[tot]]=sum; 19 fa[q[tot]]=rt;tot--; 20 } 21 return rank[x]; 22 } 23 int main(){ 24 freopen("galaxy.in","r",stdin); 25 freopen("galaxy.out","w",stdout); 26 int Q,a,b; 27 scanf("%d",&Q); 28 for(int i=1;i<=50000;i++)fa[i]=i,rank[i]=1,sz[i]=1; 29 while(Q--){ 30 scanf("%s",op); 31 scanf("%d%d",&a,&b); 32 if(op[0]==‘M‘){ 33 int ra,rb; 34 Find(a,ra); 35 Find(b,rb); 36 fa[ra]=rb; 37 rank[ra]=sz[rb]+1; 38 sz[rb]+=sz[ra]; 39 } 40 else{ 41 int ra,rb,la,lb; 42 la=Find(a,ra); 43 lb=Find(b,rb); 44 if(ra!=rb) 45 printf("-1\n"); 46 else 47 printf("%d\n",la>lb?la-lb-1:lb-la-1); 48 } 49 } 50 return 0; 51 }
数据结构(并查集):260. [NOI2002] 银河英雄传说
标签:
原文地址:http://www.cnblogs.com/TenderRun/p/5389764.html