Acwing 398 这份代码90pts,TLE,可能被卡常了, 洛谷UVA,WA了???
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define rnt register int
#define rep(i,l,r) for(int i = (int)l;i <= (int)r;i++)
#define per(i,r,l) for(int i = (int)r;i >= (int)l;i--)
#define pb push_back
#define all(a) a.begin(),a.end()
#define fi first
#define se second
#define mp make_pair
#define SZ(a) (int)(a.size())
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef long long ll;
typedef double db;
const int N = 2e4 + 10, inf = 1e9, P = inf + 7;
int n, m, k, tim, cnt, num;
int low[N], dfn[N], new_id[N], bel[N], ver[N], dep[N], fa[N][16], dis[N];
bool cut[N];
stack<int> stk;
vector<PII> eg[N];
VI ceg[N], cc[N];
inline void read (rnt &X){
X = 0;rnt w = 0; char ch = 0;
while (!isdigit (ch)) {w |= ch == '-'; ch = getchar ();}
while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar ();
if (w) X = -X;
}
void print(rnt res){
if(res<0){putchar('-'); res=-res;}
if(res>9) print(res/10);
putchar(res%10+'0');
}
inline void init() {
tim = cnt = 0;
rep(i,1,2*n) {
eg[i].clear();
cc[i].clear();
ceg[i].clear();
dfn[i] = low[i] = dep[i] = dis[i] = 0;
}
while (!stk.empty()) stk.pop();
}
void dfs(rnt u) {
dis[u] = dis[fa[u][0]] + (u > num);
dep[u] = dep[fa[u][0]] + 1;
for (auto v : ceg[u]) {
if (dep[v]) continue;
fa[v][0] = u;
dfs(v);
}
}
inline void Init() {
rep(j,1,15)
rep(i,1,n)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
inline int lca(rnt x, rnt y) {
if (dep[x] < dep[y]) swap(x, y);
per(i,15,0) if (dep[fa[x][i]] >= dep[y])
x = fa[x][i];
if (x == y) return x;
per(i,15,0) if (fa[x][i] != fa[y][i]) {
x = fa[x][i];
y = fa[y][i];
}
return fa[x][0];
}
void tarjan(rnt u, rnt f) {
dfn[u] = low[u] = ++tim;
if (u == f && eg[u].empty()) {
cc[++cnt].clear();
cc[cnt].pb(u);
return ;
}
stk.push(u);
rnt ch = 0;
for (auto [v, id] : eg[u]) {
if (!dfn[v]) {
ch++;
tarjan(v, u);
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
cut[u] = true;
++cnt;
while (true) {
rnt t = stk.top();
stk.pop();
cc[cnt].pb(t);
if (t == v) break;
}
cc[cnt].pb(u);
}
} else low[u] = min(low[u], dfn[v]);
}
if (u == f && ch <= 1)
cut[u] = false;
}
int main() {
while(true) {
read(n); read(m);
if (!n && !m) break;
init();
rep(i,1,m) {
rnt u, v;
read(u); read(v);
eg[u].pb({v, i});
eg[v].pb({u, i});
}
rep(i,1,n) if (!dfn[i])
tarjan(i, i);
num = cnt;
rep(i,1,n) if (cut[i])
new_id[i] = ++cnt;
rep(i,1,num) {
for (auto u : cc[i]) {
if (cut[u]) {
ceg[i].pb(new_id[u]);
ceg[new_id[u]].pb(i);
}
bel[u] = i;
}
for (auto u : cc[i])
for (auto [v, id] : eg[u])
if (bel[v] == bel[u])
ver[id] = i;
}
rep(i,1,cnt) {
sort(all(ceg[i]));
ceg[i].erase(unique(all(ceg[i])), ceg[i].end());
}
rep(i,1,cnt) if (!dep[i]) {
dep[i] = 1;
dfs(i);
}
Init();
rnt q;
read(q);
while (q--) {
rnt u, v;
read(u); read(v);
u = ver[u], v = ver[v];
rnt d = lca(u, v);
print(dis[u] + dis[v] - dis[d] - dis[fa[d][0]]);
putchar('\n');
}
fflush(0);
}
return 0;
}