0pt求助,悬赏两个关注
查看原帖
0pt求助,悬赏两个关注
481527
AC_CSP楼主2023/1/28 15:21

惨不忍睹

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
const int M=5e4+7;
struct Graph1{
	struct edge{
		int nxt,v;
	}e[N];
	int h[N],cnt;
	inline void add_edge(int u,int v){
		e[++cnt].nxt=h[u],e[cnt].v=v;
		h[u]=cnt;
	}
	int dfn[N],low[N],tot,st[N],top,belong[N],x;
	inline void Tarjan(int u,int fa){
		dfn[u]=low[u]=++tot;
		st[++top]=u;
		for(int i=h[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(v==fa) continue;
			if(!dfn[v]){
				Tarjan(v,u);
				low[u]=min(low[u],low[v]);
			}else low[u]=min(low[u],dfn[v]);
		}
		if(low[u]==dfn[u]){
			int v;x++;
			do belong[v=st[top--]]=x; while(u!=v);
		}
	}
}G1;
struct Gragh2{
	int n;
	struct edge{
		int nxt,v;
	}e[N];
	int h[N],cnt;
	inline void add_edge(int u,int v){
		e[++cnt].nxt=h[u],e[cnt].v=v;
		h[u]=cnt;
	}
	int fa[N][16];
	int dep[N];
	inline void dfs(int u,int _fa){
		for(int i=h[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(v==_fa) continue;
			dep[v]=dep[u]+1;fa[v][0]=u;
			dfs(v,u);
		}
	}
	inline void init(){
		for(int i=1;i<=15;i++)
			for(int j=1;j<=n;j++)
				fa[j][i]=fa[fa[j][i-1]][i-1];
	}
	inline int LCA(int x,int y){
		if(dep[x]<dep[y]) swap(x,y);
		if(x==y) return x;
		for(int i=15;i>=0;i--)
			if(dep[fa[x][i]]>=dep[y])
				x=fa[x][i];
		if(x==y) return x;
		for(int i=15;i>=0;i--)
			if(fa[x][i]!=fa[y][i])
				x=fa[x][i],y=fa[y][i];
		return fa[x][0]; 
	}
}G2;
int n,m,q,a,b;
int u[N],v[N];
inline void print(int u){
	int tmp[20]={0};int cnt;
	while(u) tmp[++cnt]=u&1,u>>=1;
	while(cnt) putchar(tmp[cnt--]?'1':'0');
	putchar('\n');
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u[i],&v[i]);
		G1.add_edge(u[i],v[i]),G1.add_edge(v[i],u[i]);
	}
	for(int i=1;i<=n;i++) if(!G1.dfn[i]) G1.Tarjan(i,0);
	for(int i=1;i<=m;i++){
		u[i]=G1.belong[u[i]],v[i]=G1.belong[v[i]];
		if(u[i]!=v[i]){
			G2.add_edge(u[i],v[i]);
			G2.add_edge(v[i],u[i]);
		}
	}
	G2.n=G1.x;G2.dep[1]=1;G2.dfs(1,0);
	G2.init();
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&a,&b);a=G1.belong[a],b=G1.belong[b];
		print(G2.dep[a]+G2.dep[b]-G2.dep[G2.LCA(a,b)]*2+1);
	}
	return 0;
} 
2023/1/28 15:21
加载中...