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\n",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 }

 

posted @ 2018-11-19 21:10  Ressed  阅读(280)  评论(0编辑  收藏  举报