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

Posted ressed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
42             else printf("%d
",abs(dis[a]-dis[b])-1);
43         }
44     }
45     return 0;
46 }

 

以上是关于luogu1196 银河英雄传说 (并查集)的主要内容,如果未能解决你的问题,请参考以下文章

P1196 [NOI2002] 银河英雄传说(并查集)

银河英雄传说 - 带权并查集

[luoguP1196] 银河英雄传说(并查集)

NOI2002 银河英雄传说(luogu p1196)

P1196 银河英雄传说(加权并查集)

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