45ptsWA求助
查看原帖
45ptsWA求助
663629
lrjdsb楼主2022/11/10 13:39
#include<bits/stdc++.h>
#define N 10005
#define M 100005
using namespace std;
int n,m,t,i,k,l,a[M],b[M],cnt,num,u[M];
int low[N],dfn[N],in[N],rem[N],h[N];
int f[N][20],v[N];
bool op[N][N];
stack<int> s;
struct qwq{
	int b,n;
}d[M];
void cun(int a,int b){
	d[++k].b=b;
	d[k].n=h[a],h[a]=k;
}
void Tarjan(int a){
	dfn[a]=low[a]=++num;
	in[a]=1,s.push(a);
	int i,b;
	for(i=h[a];i;i=d[i].n){
		if(u[i]) continue;
		b=d[i].b;
		u[i-!(i&1)]=u[i+(i&1)]=1;
		if(!dfn[b]){
			Tarjan(b);
			low[a]=min(low[a],low[b]);
		}
		else if(in[b]) low[a]=min(low[a],dfn[b]);
	}
	if(low[a]==dfn[a]){
		cnt++;
		do{
			b=s.top();
			in[b]=0,s.pop();
			rem[b]=cnt;
		}while(a!=b);
	}
}
void print(int n){
	if(!n) return;
	print(n>>1);
	putchar(n&1|'0');
}
void dfs(int a,int p){
	int i,b;
	for(i=h[a];i;i=d[i].n){
		b=d[i].b;
		if(b==p) continue;
		v[b]=v[a]+1;
		dfs(b,f[b][0]=a);
	}
}
int lca(int a,int b){
	if(a==b) return a;
	if(v[a]<v[b]) swap(a,b);
	int i;
	for(i=15;i>=0;i--)
		if(v[a]-v[b] & 1<<i)
			a=f[a][i];
	if(a==b) return a;
	for(i=15;i>=0;i--)
		if(f[a][i]!=f[b][i])
			a=f[a][i],b=f[b][i];
	return f[a][0];
}
int main(){
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i){
		++l;
		scanf("%d%d",&a[l],&b[l]);
		if(a==b || op[a[l]][b[l]] || op[b[l]][a[l]]){
			l--;
			continue;
		}
		cun(a[l],b[l]);
		cun(b[l],a[l]);
		op[a[l]][b[l]]=op[b[l]][a[l]]=1;
	}
	for(i=1;i<=n;i++){
		if(!dfn[i]){
			num=0;
			Tarjan(i);
		}
	}
	memset(h,0,sizeof(h));
	k=0;
	for(i=1;i<=l;i++){
		if(rem[a[i]]==rem[b[i]]) continue;
		cun(rem[a[i]],rem[b[i]]);
		cun(rem[b[i]],rem[a[i]]);
	}
	dfs(1,0);
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		n=rem[n],m=rem[m];
		k=lca(n,m);
		print(v[n]+v[m]-v[k]*2+1);
		puts("");
	}
	return 0;
}

LCA+Tarjan马蜂极好,求大佬解惑

2022/11/10 13:39
加载中...