luogu1196 銀河英雄傳說 (並查集)
阿新 • • 發佈:2018-11-01
並查集,不僅記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 }