zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    [模板] 文艺平衡树
    [模板]平衡树splay
    [ZJOI2015]诸神眷顾的幻想乡
    [HAOI2016]找相同字符
    SP8093 JZPGYZ
    SP1812 LCS2
    SP1811 LCS
    AHOI2013 差异
    TJOI2015 弦论
    工艺(SAM)
  • 原文地址:https://www.cnblogs.com/Ressed/p/9887250.html
Copyright © 2011-2022 走看看