27分蒟蒻求助,都WA了
查看原帖
27分蒟蒻求助,都WA了
167829
李坤泽楼主2021/7/19 18:45
#include<bits/stdc++.h>
#define re register
using namespace std;

inline long long read(){
	re long long x=0,f=1;re char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x*f;
}

struct Edge{
	long long from,to,pre;
} edge[100005],e[100005];

long long last[10005],cnt=1,nlast[10005],ncnt=1;;

void add(long long x,long long y){
	++cnt;
	edge[cnt].from=x;
	edge[cnt].to=y;
	edge[cnt].pre=last[x];
	last[x]=cnt;
}

void nadd(long long x,long long y){
	++ncnt;
	e[ncnt].from=x;
	e[ncnt].to=y;
	e[ncnt].pre=nlast[x];
	nlast[x]=ncnt;
}

long long dfn[10005],low[10005];
bool bridge[100005];
long long num=0,qnum[10005];

void tarjan(long long x,long long y){
	dfn[x]=low[x]=++num;
	for(long long i=last[x];i;i=edge[i].pre){
		long long v=edge[i].to;
		if(!dfn[v]){
			tarjan(v,i);
			low[x]=min(low[x],low[v]);
			if(low[v]>dfn[x]){
				bridge[i]=bridge[i^1]=true;
				++qnum[0];
				qnum[qnum[0]]=i;
			}
		}
		else if((i^1)!=y) low[x]=min(low[x],dfn[v]);
	}
	return;
}

long long sltnum=0,belong[10005];

void dfs(long long x){
	belong[x]=sltnum;
	for(long long i=last[x];i;i=edge[i].pre){
		if(bridge[i]||belong[edge[i].to]) continue;
		dfs(edge[i].to);
	}
	return;
}

long long f[100005][18],deep[100005];

void st(long long x,long long fa){
	deep[x]=deep[fa]+1;
	for(int i=nlast[x];i;i=e[i].pre){
		if(e[i].to==fa) continue;
		f[e[i].to][0]=x;
		st(e[i].to,x);
	}
	long long len=log2(deep[x])+1;
	for(int i=1;i<=len;++i) f[x][i]=f[f[x][i-1]][i-1];
	return;
}

long long LCA(long long x,long long y){
	if(deep[x]>deep[y]) swap(x,y);
	int len=log2(deep[y]-deep[x])+1;
	for(int i=len;i>=0;--i){
		if(deep[f[y][i]]>=deep[x]) y=f[y][i];
	}
	if(x==y) return x;
	len=log2(deep[x])+1;
	for(int i=len;i>=0;--i){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}

void write(long long x){
	if(x==0){
		printf("0");
		return;
	}
	if(x==1){
		printf("1");
		return;
	}
	write(x>>1);
	printf("%lld",x%2);
}

long long n,m,q;
int main(){
	n=read(); m=read();
	long long u,v;
	for(int i=1;i<=m;++i){
		u=read(); v=read();
		add(u,v);
		add(v,u);
	}
	tarjan(1,0);
	for(int i=1;i<=n;++i){
		if(!belong[i]){
			++sltnum;
			dfs(i);
		}
	}
	for(int i=1;i<=qnum[0];++i){
		nadd(belong[edge[qnum[i]].from],belong[edge[qnum[i]].to]);
		nadd(belong[edge[qnum[i]].to],belong[edge[qnum[i]].from]);
	}
	q=read();
	st(1,0);
	long long a,b;
	for(int i=1;i<=q;++i){
		a=read(); b=read();
		a=belong[a]; b=belong[b];
		write(deep[a]+deep[b]-2*deep[LCA(a,b)]+1);
		printf("\n");
	}
	return 0;
}
2021/7/19 18:45
加载中...