萌新刚学圆方树求助,ACwing能过,UVA过不了
查看原帖
萌新刚学圆方树求助,ACwing能过,UVA过不了
322266
Minuswy楼主2023/9/27 12:23

圆方树+lca,调了好久都过不了 /kel


#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define endl "\n"
#define mem(qwq) memset(qwq,0,sizeof(qwq))
using namespace std;
const int N=2e5+5;
int n,m,q;
int dfn[N],low[N],dfc,stk[N],top,fcnt;
int dep[N],f[30][N],fa[N];
vector<int>e[N],E[N];
struct edge{
	int u,v;
}w[N];
void tarjan(int u){
	dfn[u]=low[u]=++dfc;
	stk[++top]=u;
	for(auto v:e[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]==dfn[u]){
				E[++fcnt].push_back(u);
				E[u].push_back(fcnt);
				do{
					E[fcnt].push_back(stk[top]);
					E[stk[top]].push_back(fcnt);
				}while(stk[top--]!=v);
			}
		}else low[u]=min(low[u],dfn[v]);
	}
}
void dfs(int u,int pa){
	dep[u]=dep[pa]+1;
	f[0][u]=pa;
	fa[u]=pa;
	for(auto v:E[u]){
		if(v!=pa) dfs(v,u);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	ROF(i,25,0){
		if(dep[f[i][u]]>=dep[v]) u=f[i][u];
	}
	if(u==v) return u;
	ROF(i,25,0){
		if(f[i][u]!=f[i][v]) u=f[i][u],v=f[i][v];
	}
	return f[0][u];
}
inline int read(){
    int xr=0,F=1; char cr;
    while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
    while(cr>='0'&&cr<='9') 
        xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
    return xr*F;
}
int solve(int u,int v){
	int z=lca(u,v);
	return (dep[u]+dep[v]-dep[z]*2)/2-1;
}
signed main(){
	n=read(),m=read();
	while(n&&m){
		fcnt=n;
		FOR(i,1,m){
			int u,v;
			u=read(),v=read();
			w[i].u=u,w[i].v=v;
			e[u].push_back(v);
			e[v].push_back(u); 
		}
		FOR(i,1,n){
			if(!dfn[i]) tarjan(i);
		}
		dfs(1,0);
		FOR(j,1,25){
			FOR(i,1,fcnt){
				f[j][i]=f[j-1][f[j-1][i]];
			}
		}
//		FOR(i,1,fcnt){
//			cout<<i<<" "<<dep[i]<<endl;
//		}
		q=read();
		while(q--){
			int S,t,ans=0;
			S=read(),t=read();
			ans=max(ans,solve(w[S].u,w[t].u));
			ans=max(ans,solve(w[S].u,w[t].v));
			ans=max(ans,solve(w[S].v,w[t].u));
			ans=max(ans,solve(w[S].v,w[t].v));
			printf("%d\n",ans);
		}
		FOR(i,1,fcnt){
			dfn[i]=low[i]=dep[i]=fa[i]=0;
			w[i].u=w[i].v=0;
			e[i].clear(),E[i].clear();
			FOR(j,0,25) f[j][i]=0;
		}
		top=dfc=0;
		n=read(),m=read();
	}	
	return (0-0);
}

2023/9/27 12:23
加载中...