萌新求助边双裸题
查看原帖
萌新求助边双裸题
236862
Miraik楼主2022/6/25 19:53

RT。看了讨论区判了重边,还是只有 63pts63pts

实在找不出错QwQ

#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define sec second
#define fir first
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
using namespace std;
typedef long long ll;
const int N=500005;
const int inf=(1<<30)-1;
const ll inff=1ll<<60;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int n,m,q;
int tot[2],head[N][2];
struct Edge{
	int from,to,nxt;
}e[N<<1][2];
int dfn[N],low[N],ind;
int bri[N<<1];
int from[N];
int cnt,lg[N],dep[N],fa[N][25];
void out(int x){
	for(int i=lg[x];i>=0;i--)
	    putchar('0'+((x&(1<<i))?1:0));
	putchar('\n');
}
void add(int u,int v,int p){
	e[++tot[p]][p].from=u;
	e[tot[p]][p].to=v;
	e[tot[p]][p].nxt=head[u][p];
	head[u][p]=tot[p];
}
void tarjan(int u,int fa){
	dfn[u]=low[u]=(++ind);
	for(int i=head[u][0];i;i=e[i][0].nxt){
		int v=e[i][0].to;
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u])
			    bri[i]=bri[i^1]=1;
		}
		else if(v!=fa) low[u]=min(low[u],dfn[v]);
	}
}
void dfs1(int u){
	from[u]=cnt;
	for(int i=head[u][0];i;i=e[i][0].nxt){
		int v=e[i][0].to;
		if(bri[i] || from[v]) continue;
		dfs1(v);
	}
}
void dfs2(int u,int father){
	for(int i=head[u][1];i;i=e[i][1].nxt){
		int v=e[i][1].to;
		if(v==father) continue;
		dep[v]=dep[u]+1;
		fa[v][0]=u;
		dfs2(v,u);
	}
}
int anc(int x,int t){
	for(int i=lg[t];i>=0;i--)
	    if(t & (1<<i)) x=fa[x][i];
	return x;
}
int lca(int u,int v){
	if(dep[u] > dep[v]) u^=v^=u^=v;
	v=anc(v,dep[v]-dep[u]);
	if(u==v) return u;
	for(int i=lg[dep[u]];i>=0;i--)
	    if(fa[u][i] != fa[v][i])
		    u=fa[u][i],v=fa[v][i];
	return fa[u][0]; 
}
set<pii>mul;
int main(){int tests=1;//tests=read();
while(tests--){
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		if(u!=v && !mul.count(mp(u,v)))
		    add(u,v,0),add(v,u,0),
		    mul.insert(mp(u,v)),mul.insert(mp(v,u));
	}
	for(int i=1;i<=n;i++)
	    if(!dfn[i]) tarjan(i,-1);
	for(int i=1;i<=n;i++)
	    if(!from[i]) cnt++,dfs1(i);
	for(int u=1;u<=n;u++)
	    for(int i=head[u][0];i;i=e[i][0].nxt){
	    	int v=e[i][0].to;
//	    	printf("u:%d from[u]:%d v:%d from[v]:%d\n",u,from[u],v,from[v]);
	    	if(from[u] != from[v])
	    	    add(from[u],from[v],1);
	    }
	dfs2(1,-1);
	for(int i=2;i<=cnt;i++) lg[i]=lg[i>>1]+1;
	for(int j=1;j<=lg[cnt];j++)
	    for(int i=1;i<=cnt;i++)
	        fa[i][j]=fa[fa[i][j-1]][j-1];
	q=read();
	while(q--){
		int u=from[read()],v=from[read()];
		int lc=lca(u,v);
//		printf("u:%d v:%d lca:%d\n",u,v,lc);
//		printf("dep[u]:%d dep[v]:%d dep[lca]:%d\n",dep[u],dep[v],dep[lc]);
//		printf("ans:%d\n",dep[u]-dep[lc]+1+dep[v]-dep[lc]);
		out(dep[u]-dep[lc]+1+dep[v]-dep[lc]);
	}
}	return 0;
}

2022/6/25 19:53
加载中...