73pt求条
查看原帖
73pt求条
795344
lfxxx_楼主2025/1/27 13:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,M=5e6+5;
int head[N],tot=1;
int a[N],b[N];
struct{int to,nxt;}edge[M<<1];
void addedge(int u,int v)
{
    edge[++tot].to=v;
    edge[tot].nxt=head[u];
    head[u]=tot;
}
int dfn[N],low[N],id;
bool cut[N];
void tarjan(int u,int fa)
{
    dfn[u]=low[u]=++id;
    for(int i=head[u];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(v==fa) continue;
        if(!dfn[v])
        {
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])
                cut[i]=cut[i^1]=1;
        }
        else low[u]=min(low[u],dfn[v]);
    }
}
bool vis[N];
int fa[N],cnt;
void dfs(int u)
{
    if(vis[u]) return;
    vis[u]=1;
    fa[u]=cnt;
    for(int i=head[u];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(cut[i]) continue;
        dfs(v);
    }
}
int dp[N][21],dep[N],lg[N];
void DFS(int u,int f)
{
    dp[u][0]=f;
    dep[u]=dep[f]+1;
    for(int i=1;i<=20;++i)
        dp[u][i]=dp[dp[u][i-1]][i-1];
    for(int i=head[u];i;i=edge[i].nxt)
    {
        int v=edge[i].to;
        if(v==f)
            continue;
        DFS(v,u);
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y]) swap(x,y);
    while(dep[x]>dep[y])
        x=dp[x][lg[dep[x]-dep[y]]];
    if(x==y) return x;
    for(int k=20;k>=0;--k)
        if(dp[x][k]!=dp[y][k])
            x=dp[x][k],y=dp[y][k];
    return dp[x][0];
}
void print(int n)
{
    string s;
    while(n)
    {
        s+=n%2+'0';
        n/=2;
    }
    reverse(s.begin(),s.end());
    cout<<s;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        cin>>a[i]>>b[i];
        addedge(a[i],b[i]);
        addedge(b[i],a[i]);
    }
    lg[0]=-1;
    for(int i=1;i<=n;++i)
    {
        
        if(!dfn[i])
            tarjan(i,0);
        lg[i]=lg[i>>1]+1;
    }

    for(int i=1;i<=n;++i)
        if(!vis[i])
        {
            ++cnt;
            dfs(i);
        }
    memset(head,0,sizeof head);
    tot=0;
    for(int i=1;i<=m;++i)
    {
        int u=fa[a[i]],v=fa[b[i]];
        if(u!=v)
        {
            addedge(u,v);
            addedge(v,u);
        }
    }
    for(int i=1;i<=n;++i)
        if(!dep[i])
            DFS(i,0);
    int q;
    for(cin>>q;q--;)
    {
        int x,y;
        cin>>x>>y;  
        x=fa[x],y=fa[y];
        int LCA=lca(x,y);
        assert(LCA>0&&LCA<=n);
        print(dep[x]+dep[y]-2*dep[LCA]+1);
        cout<<'\n';
    }
}
2025/1/27 13:28
加载中...