luogu1196 银河英雄传说 (并查集)

并查集,不仅记fa,还记与fa的距离,还记根对应的尾节点

路径压缩的时候更新那个距离就行了

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=3e4+10;
 7 
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
12     return x*neg;
13 }
14 
15 int fa[maxn],tl[maxn],dis[maxn],T,N=30000;
16 
17 inline int getf(int x){
18     if(x==fa[x]) return x;
19     int re=getf(fa[x]);
20     dis[x]+=dis[fa[x]],fa[x]=re;
21     return re;
22 }
23 
24 inline void add(int x,int y){
25     int a=getf(x),b=getf(y);
26     fa[a]=tl[b],tl[b]=tl[a],dis[a]=1;
27 }
28 
29 int main(){
30     // freopen("testdata.in","r",stdin);
31     int i,j,k;
32     T=rd();
33     for(i=1;i<=N;i++)
34         tl[i]=fa[i]=i;
35     for(i=1;i<=T;i++){
36         char s[5];scanf("%s",s);
37         int a=rd(),b=rd();
38         if(s[0]=='M') add(a,b);
39         else{
40             int x=getf(a),y=getf(b);
41             if(x!=y) printf("-1\n");
42             else printf("%d\n",abs(dis[a]-dis[b])-1);
43         }
44     }
45     return 0;
46 }

 

posted @ 2018-11-01 08:42  Ressed  阅读(203)  评论(0编辑  收藏  举报