并查集维护每个联通块的直径和最小的最大深度,每次连得时候连的肯定是最大深度最小的那两个点
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 }