如题,可能是重边的问题,已经判过了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, l;
vector <int> Kg[N];
int dfn[N], low[N], tot, id[N];
stack <int> k;
map <int, map<int, bool> > G;
vector <vector<int> > bccs;
void tarjan(int u, int la) {
dfn[u] = low[u] = ++tot;
k.push(u);//
for (int e : Kg[u]) {
if (e == la) continue;
if (!dfn[e]) {//
tarjan(e, u);
low[u] = min(low[u], low[e]);
if (dfn[u] < low[e]) {
vector <int> bcc;
while (1) {
int r = k.top(); k.pop();
bcc.push_back(r);
id[r] = bccs.size() + 1;
if (r == e) break;//
}
bccs.push_back(bcc);
}
} else low[u] = min(low[u], dfn[e]);
}
}
int F[N][25], dep[N];
vector <int> g[N];
void print(int x) {if (x == 1) {cout << 1; return;} if (x == 0) {cout << 0; return;} print(x >> 1); cout << x % 2;}
void dfs(int u, int la) {
if (u != 1) {
F[u][0] = la;
for (int i = 1; i <= 25; i++) F[u][i] = F[F[u][i - 1]][i - 1];
dep[u] = dep[la] + 1;
}
for (int e : g[u]) {
if (e == la) continue;
dfs(e, u);
}
}
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v); //
int re = dep[u] - dep[v];
for (int i = 0; i <= 25; i++) {
if ((re >> i) & 1) u = F[u][i];
}
if (u == v) return u;
for (int i = 25; i >= 0; i--) {
if (F[u][i] != F[v][i]) u = F[u][i], v = F[v][i];
}
return F[u][0];
}
signed main() {
scanf("%lld %lld", &n, &l);
for (int i = 1; i <= l; i++) {
int u, v;
scanf("%lld %lld", &u, &v);
if (G[u][v] || G[v][u]) continue;
G[u][v] = 1, G[v][u] = 1;
Kg[u].push_back(v);
Kg[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
if (!dfn[i]) tarjan(i, 0);
if (k.size()) {
vector <int> bcc;
while (k.size()) {
int r = k.top(); k.pop();
bcc.push_back(r);
id[r] = bccs.size() + 1;
}
bccs.push_back(bcc);
}
}
for (int i = 1; i <= n; i++) {
for (int j : Kg[i]) {
if (id[i] == id[j]) continue;
g[id[i]].push_back(id[j]);
//g[id[j]].push_back(id[i]);//
}
}
dfs(1, 0);
int q;
scanf("%lld", &q);
while (q--) {
int u, v;
scanf("%lld %lld", &u, &v);
u = id[u], v = id[v]; //
int ans = dep[u] + dep[v] - 2 * dep[lca(u, v)] + 1;
print(ans); cout << endl;
}
return 0;
}