zoukankan      html  css  js  c++  java
  • cf455C Civilization (并查集)

    并查集维护每个联通块的直径和最小的最大深度,每次连得时候连的肯定是最大深度最小的那两个点

     1 #pragma GCC optimize(3)
     2 #include<bits/stdc++.h>
     3 #define pa pair<ll,ll>
     4 #define CLR(a,x) memset(a,x,sizeof(a))
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn=3e5+10;
     8 
     9 inline char gc(){
    10     return getchar();
    11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
    12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
    13 }
    14 inline ll rd(){
    15     ll x=0;char c=gc();bool neg=0;
    16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
    17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
    18     return neg?(~x+1):x;
    19 }
    20 
    21 int N,M,Q;
    22 int fa[maxn],low[maxn],len[maxn];
    23 int up[maxn],dw[maxn];
    24 int eg[maxn*2][2],egh[maxn],ect;
    25 
    26 inline void dfs1(int t,int x,int f){
    27     fa[x]=t;
    28     for(int i=egh[x];i;i=eg[i][1]){
    29         int b=eg[i][0];if(b==f) continue;
    30         dfs1(t,b,x);
    31         dw[x]=max(dw[x],dw[b]+1);
    32     }
    33 }
    34 inline void dfs2(int t,int x,int f){
    35     int ma=0,se=0;
    36     low[t]=min(low[t],max(up[x],dw[x]));
    37     for(int i=egh[x];i;i=eg[i][1]){
    38         int b=eg[i][0];if(b==f) continue;
    39         se=max(se,dw[b]+2);
    40         if(se>ma) swap(se,ma);
    41     }
    42     for(int i=egh[x];i;i=eg[i][1]){
    43         int b=eg[i][0];if(b==f) continue;
    44         if(dw[b]+2!=ma) up[b]=max(up[x]+1,ma);
    45         else up[b]=max(up[x]+1,se);
    46         dfs2(t,b,x);
    47     }
    48 }
    49 
    50 inline pa dfs3(int x,int f,int d){
    51     pa m=make_pair(d,x);
    52     for(int i=egh[x];i;i=eg[i][1]){
    53         int b=eg[i][0];if(b==f) continue;
    54         m=max(m,dfs3(b,x,d+1));
    55     }return m;
    56 }
    57 
    58 inline void adeg(int a,int b){
    59     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
    60 }
    61 
    62 inline int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
    63 
    64 int main(){
    65     //freopen("","r",stdin);
    66     int i,j,k;
    67     N=rd(),M=rd(),Q=rd();
    68     for(i=1;i<=M;i++){
    69         int a=rd(),b=rd();
    70         adeg(a,b);adeg(b,a);
    71     }
    72     for(i=1;i<=N;i++) fa[i]=i;
    73     for(i=1;i<=N;i++){
    74         if(fa[i]==i){
    75             low[i]=23333333;
    76             dfs1(i,i,0);dfs2(i,i,0);
    77             len[i]=dfs3(dfs3(i,0,0).second,0,0).first;
    78         }
    79     }
    80     for(i=1;i<=Q;i++){
    81         int o=rd();
    82         if(o==1) printf("%d
    ",len[getf(rd())]);
    83         else{
    84             int a=rd(),b=rd();
    85             a=getf(a),b=getf(b);
    86             if(a==b) continue;
    87             len[a]=max(max(len[a],len[b]),low[a]+low[b]+1);
    88             low[a]=min(max(low[a],low[b]+1),max(low[b],low[a]+1));
    89             fa[b]=a;
    90         }
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    bzoj2045: 双亲数&bzoj1101: [POI2007]Zap
    spoj GCDEX
    jQuery Ajax
    jQuery 动画效果
    jQuery 事件处理API
    jQuery 常用getter&setter
    jQuery 文档操作
    jQuery 基础
    Vue2.2.0+新特性整理
    JavaScript中的HTTP
  • 原文地址:https://www.cnblogs.com/Ressed/p/9985738.html
Copyright © 2011-2022 走看看