洛谷P1196 [NOI2002]银河英雄传说 并查集

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 using namespace std;
 5 
 6 int find(int);
 7 int abs(int);
 8 void setup();
 9 
10 int fa[30005];
11 int size[30005];
12 int d[30005];
13 int T,x,y,fx,fy;
14 char f;
15 
16 int main(){
17     setup();
18     scanf("%d",&T);
19     for(int i=1;i<=T;i++){
20         do{
21             f=getchar();
22         }while(f!='M' && f!='C');
23         scanf("%d%d",&x,&y);
24         fx=find(x);
25         fy=find(y);
26         if(f=='C'){
27             if(fx==fy)printf("%d\n",abs(d[x]-d[y])-1);
28             else printf("-1\n");
29         }
30         else{
31             fa[fx]=fy;
32             d[fx]=size[fy];
33             size[fy]+=size[fx];
34         }
35     }
36     
37     return 0;
38 }
39 
40 int find(int x){  //无需处理size 
41     if(fa[x]==x)return x;
42     else{
43         int gf=find(fa[x]);
44         d[x]+=d[fa[x]];
45         return fa[x]=gf;
46     }
47 }
48 
49 int abs(int x){
50     if(x<0)return -x;
51     else return x;
52 }
53 
54 void setup(){
55     for(int i=1;i<=30000;i++){
56         fa[i]=i;
57         size[i]=1;
58         d[i]=0;
59     }
60 }

 

posted @ 2019-08-11 21:02  Running-Coder  阅读(168)  评论(0编辑  收藏  举报