清新边双LCA求条
查看原帖
清新边双LCA求条
594916
OcTar楼主2023/11/14 20:28

rt,AC On #2, #7

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 10100, maxm = 50500;
struct Edge {
	int to, nxt;
}edge[maxm << 1], nedge[maxm << 1];
int tot = -1, ntot = -1;
int h[maxn], nh[maxn];
void add(int u, int v) {
	edge[++tot] = (Edge){v, h[u]};
	h[u] = tot;
}
void nadd(int u, int v) {
	nedge[++ntot] = (Edge){v, nh[u]};
	nh[u] = ntot;
}
int n, m;
int q, bridge_cnt;
int dfn[maxn], low[maxn];
int timer, bcc_cnt, bccno[maxn];
int LOG[maxn];
bool in_stack[maxn];
vector<int> bcc[maxn];
stack<int> S;
void tarjan(int u, int fa) {
	dfn[u] = low[u] = ++timer;
	int child = 0;
	S.push(u);
	for (int i = h[u]; i; i = edge[i].nxt) {
		int v = edge[i].to;
		if (dfn[v] == 0) {
			child++;
			tarjan(v, u);
			low[u] = min(low[u], low[v]);
		} else if (v != fa) {
			low[u] = min(low[u], dfn[v]);
		}
	}
	if (dfn[u] == low[u]) {
		if (fa != u) ++bridge_cnt;
		++bcc_cnt;
		while (1) {
			int x = S.top();
			S.pop();
			bccno[x] = bcc_cnt;
			bcc[bcc_cnt].push_back(x);
			if (x == u) break;
		}
	}
}
int dep[maxn], f[maxn][21];
void dfs(int u) {
	dep[u] = dep[f[u][0]] + 1;
	for (int i = nh[u]; ~i; i = nedge[i].nxt) {
		int v = nedge[i].to;
		if (v == f[u][0]) continue;
		f[v][0] = u;
		dfs(v);
	}
}
int LCA(int x, int y) {
	if (dep[x] < dep[y]) swap(x, y);
	int K = 0;
	while ((1 << (K + 1)) <= dep[x]) ++K;
	for (int j = K; j >= 0; j--) {
		if (dep[f[x][j]] >= dep[y]) x = f[x][j];
	}
	if (x == y) return x;
	for (int j = K; j >= 0; j--) {
		if (f[x][j] != f[y][j]) x = f[x][j], y = f[y][j];
	}
	return f[x][0];
}
void init() {
	for (int i = 2; i <= n; i++) LOG[i] = LOG[i >> 1] + 1;
}
void print(int x) {
	for (int i = LOG[x]; i >= 0; i--) cout << ((x >> i) & 1);
	cout << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	memset(h, -1, sizeof(h));
	memset(nh, -1, sizeof(nh));
	for (int i = 1, u, v; i <= m; i++) {
		cin >> u >> v;
		add(u, v), add(v, u);
	}
	for (int i = 1; i <= n; i++) {
		if (dfn[i] == 0) tarjan(i, i);
	}
	for (int u = 1; u <= n; u++) {
		for (int i = h[u], v; ~i; i = edge[i].nxt) {
			v = edge[i].to;
			if (bccno[u] != bccno[v]) nadd(bccno[u], bccno[v]);
		}
	}
	dfs(1);
	for (int j = 1; (1 << j) <= n; j++) {
		for (int i = 1; i <= n; i++) {
			f[i][j] = f[f[i][j - 1]][j - 1];
		}
	}
	init();
	cin >> q;
	while (q--) {
		int a, b;
		cin >> a >> b;
		int lca = LCA(a, b);
		print(dep[a] + dep[b] - 2 * dep[lca] + 1);
	}
	return 0;
}
2023/11/14 20:28
加载中...