1. 程式人生 > >P1196 【[NOI2002]銀河英雄傳說】

P1196 【[NOI2002]銀河英雄傳說】

兩個 eset div res name == col tom thml

以下有T行,每行有一條指令。指令有兩種格式:

  1. Mi,jij是兩個整數(1≤i,j≤30000),表示指令涉及的戰艦編號。該指令是萊因哈特竊聽到的楊威利發布的艦隊調動指令,並且保證第i號戰艦與第j號戰艦不在同一列。

  2. Ci,jij是兩個整數(1≤i,j≤30000),表示指令涉及的戰艦編號。該指令是萊因哈特發布的詢問指令。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,dis[1000000],ans[1000000],fa[1000000];
 5 int find(int x)
 6 {
 7     if
(x!=fa[x]) 8 { 9 int next=fa[x]; 10 fa[x]=find(fa[x]); 11 dis[x]+=dis[next]; 12 ans[x]=ans[fa[x]]; 13 } 14 return fa[x]; 15 } 16 int main() 17 { 18 scanf("%d",&n); 19 int x,y; 20 char s[10]; 21 for(int i=1;i<=n;++i) fa[i]=i,ans[i]=1;
22 for(int i=1;i<=n;++i) 23 { 24 scanf("%s%d%d",s,&x,&y); 25 if(s[0]==M) 26 { 27 int r1=find(x),r2=find(y); 28 if(r1!=r2) 29 { 30 fa[r1]=r2; 31 dis[r1]+=dis[r2]+ans[r2]; 32 ans[r1]+=ans[r2];
33 ans[r2]=ans[r1]; 34 } 35 } 36 if(s[0]==C) 37 { 38 int r1=find(x),r2=find(y); 39 if(r1!=r2) printf("-1\n"); 40 else printf("%d\n",abs(dis[x]-dis[y])-1); 41 } 42 } 43 }

P1196 【[NOI2002]銀河英雄傳說】