题目链接 :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;
}
}