求助站外题,acwing397附上链接
  • 板块学术版
  • 楼主Jingyan
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/4 17:14
  • 上次更新2023/10/24 05:35:26
查看原帖
求助站外题,acwing397附上链接
557682
Jingyan楼主2023/1/4 17:14

题目链接 :https://www.acwing.com/problem/content/399/

这个题我边双写的是vector存图,但是遇到了问题,不知道边双错哪了,有没有大佬帮忙看看

#include <bits/stdc++.h>
using namespace std;

constexpr int N=1e5+10;

int n,m,dfsid,cnt;
int dfn[N],low[N],fa[N],ve[N];
bool bridge[N];
vector<int> e[N],ecc[N];
stack<int> st;

void tarjan(int u){
    dfn[u]=low[u]=++dfsid;
    st.emplace(u);

    for(int v:e[u])
        if(!dfn[v]){
            fa[v]=u;

            tarjan(v);
            low[u]=min(low[u],low[v]);

            if(low[v]>dfn[u])
                bridge[v]=1;
        }
        else if(v!=fa[u])
            low[u]=min(low[u],dfn[v]);
    
    if(dfn[u]==low[u]){
        ve[u]=++cnt;
        while(st.top()!=u)
            ve[st.top()]=cnt,st.pop();
        st.pop();
    }
}

int dep[N],f[N][14],k;
void dfs(int x,int pre){
    dep[x]=dep[pre]+1;
    f[x][0]=pre;
    for(int v:ecc[x]) if(v!=pre) dfs(v,x);
}

inline int initLCA(){
    k=log2(cnt);
    dfs(1,0);
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=cnt;i++)
            f[i][j]=f[f[i][j-1]][j-1];
}

inline int LCA(int u,int v){
    if(dep[u]>dep[v]) swap(u,v);
    for(int i=k;i>=0;i--)
        if(dep[f[v][i]]>=dep[u]) v=f[v][i];
    
    if(v==u) return u;

    for(int i=k;i>=0;i--)
        if(f[u][i]!=f[v][i])
            u=f[u][i],v=f[v][i];
    return f[u][0];
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    cin>>n>>m;
    int a,b;
    for(int i=0;i<m;i++){
        cin>>a>>b;
        e[a].emplace_back(b),e[b].emplace_back(a);
    }

    for(int i=1;i<=n;i++)
        if(!dfn[i]) tarjan(i);
    
    for(int i=1;i<=n;i++)
        if(bridge[i]) 
            ecc[ve[fa[i]]].emplace_back(ve[i]),
            ecc[ve[i]].emplace_back(ve[fa[i]]);
    // for(int i=1;i<=cnt;i++)
    //     for(int v:ecc[i])
    //         cout<<i<<' '<<v<<endl;
    initLCA();
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>a>>b;
        int lca=LCA(ve[a],ve[b]);
        cout<<dep[ve[a]]+dep[ve[b]]-dep[lca]*2<<endl;
    }
}
2023/1/4 17:14
加载中...