MnZn求助圆方树
查看原帖
MnZn求助圆方树
503792
Svemit楼主2024/5/9 22:14

rt,死活调不出来

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;

int n, m;
int tot;
vector<int> e[N], G[N];
int low[N], dfn[N], tim;
int dep[N], fa[N][20];
int x[N], y[N];
stack<int> stk;

void tarjan(int u) {
	dfn[u] = low[u] = ++ tim;
	stk.push(u);
	for (auto v : e[u]) {
		if (!dfn[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
			if (low[v] >= dfn[u]) {
				tot ++;
				int x;
				do {
					x = stk.top(), stk.pop();
					G[x].push_back(tot);
					G[tot].push_back(x);
				} while (x != v);
				G[u].push_back(tot);
				G[tot].push_back(u);
			}
		} else {
			low[u] = min(low[u], dfn[v]);
		}
	}
}

void dfs(int u, int fath) {
	dep[u] = dep[fath] + 1, fa[u][0] = fath;
	for (int i = 1; i <= __lg(dep[u]); i ++) {
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for (auto v : G[u]) {
		if (v == fath) continue;
		dfs(v, u);
	}
}

int lca(int u, int v) {
	if (dep[u] < dep[v]) {
		swap(u, v);
	}
	while (dep[u] != dep[v]) {
		u = fa[u][__lg(dep[u] - dep[v])];
	}
	if (u == v) return u;
	for (int k = __lg(dep[u]); k >= 0; k --) {
		if (fa[u][k] != fa[v][k]) {
			u = fa[u][k];
			v = fa[v][k];
		}
	}
	return fa[u][0];
}

int dist(int u, int v) {
	return (dep[u] + dep[v] - 2 * dep[lca(u, v)]) / 2 - 1;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	while (cin >> n >> m, n && m) {
		for (int i = 1; i <= n * 2; i ++) {
			low[i] = dfn[i] = dep[i] = 0;
			e[i].clear(), G[i].clear();
			for (int j = 0; j <= 20; j ++) {
				fa[i][j] = 0;
			}
		}
		for (int i = 1; i <= m; i ++) {
			cin >> x[i] >> y[i];
			e[x[i]].push_back(y[i]);
			e[y[i]].push_back(x[i]);
		}
		tot = n;
		for (int i = 1; i <= n; i ++) {
			if (!dfn[i]) {
				tarjan(i);
				dfs(i, 0);
			}
		}
		int q;
		cin >> q;
		while (q --) {
			int a, b;
			cin >> a >> b;
			cout << max({dist(x[a], y[a]), dist(x[a], y[b]), dist(x[b], y[a]), dist(x[b], y[b])}) << "\n";
		}
	}

	return 0;
}
2024/5/9 22:14
加载中...