灵异
查看原帖
灵异
657864
GOD_hj楼主2022/11/21 22:07

本地 RE,提交 AC

#include<bits/stdc++.h>
using namespace std;
static inline int read(){
	int x=0;bool f=1;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=0;s=getchar();}
	while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();}
	return f?x:-x; 
}
const int M=1e4+10;
const int N=5e4+10;
vector<int>e[M]; 
vector<int>g[M];
int n,m,tot,dfn[M],low[M],vis[M],jl[M],num,kkk;
int x[N],y[N],f[M][25],dep[M];
stack<int>s;
void tarjan(int u,int fa){
    dfn[u]=low[u]=++num;
    s.push(u);
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i];
        if(v==fa)continue;
        if(!dfn[v]){
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
        }
        else if(!jl[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u]){
        ++kkk;
        while(s.top()!=u){
            jl[s.top()]=kkk;
            s.pop();
        }
        jl[s.top()]=kkk;
        s.pop();
    }
}
void dfs(int u,int fa){
    if(vis[u])return ;
    vis[u]=1;
    dep[u]=dep[fa]+1;
    for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==fa) continue;
        f[v][0]=u;
        dfs(v,u);
    }
}
static inline int lca(int a,int b){
    if(dep[a]<dep[b]) swap(a,b);
    for(int i=20;i>=0;i--)
        if(dep[f[a][i]]>=dep[b])
            a=f[a][i];
    if(a==b) return a;
    for(int i=20;i>=0;i--)
        if(f[a][i]!=f[b][i])
            a=f[a][i],b=f[b][i];
    return f[a][0];
}
void print(int x){
    if(!x)return ;
    print(x>>1);
    printf("%d",x&1);
}
signed main(void){
    n=read(),m=read();
    for(int i=1;i<=m;i++){
        x[i]=read(),y[i]=read();
        e[x[i]].push_back(y[i]);
        e[y[i]].push_back(x[i]);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i);
    for(int i=1;i<=m;i++)
        if(jl[x[i]]^jl[y[i]])
            g[jl[x[i]]].push_back(jl[y[i]]),g[jl[y[i]]].push_back(jl[x[i]]);
    kkk++;
    for(int i=1;i^kkk;i++) if(!vis[i]) dfs(i,i);
    tot=read();
    for(int i=1;i<=tot;i++){
        int x,y;
        x=read(),y=read();
        int l=lca(jl[x],jl[y]);
        print(dep[jl[x]]-dep[l]+dep[jl[y]]-dep[l]+1);
        puts(" ");
    }
    return 0;
}
2022/11/21 22:07
加载中...