倍增LCA板子,没有压行,可读性应该还可以。转载请随意。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 5e5; int n, m, rt; vector<int> G[maxn]; ; ]; int dep[maxn]; void dfs(int u, int fa2, int dep2) { fa[u][] = fa2; dep[u] = dep2; ; i <= maxlog; ++i) { ] == -) { fa[u][i] = -; } else { fa[u][i] = fa[ fa[u][i-] ][i-]; } } ; i < (int)G[u].size(); ++i) { int v = G[u][i]; if(v != fa2) { dfs(v, u, dep2 + ); } } } int lca(int u, int v) { if(dep[u] < dep[v]) { swap(u, v); } ; --i) { << i) >= dep[v]) { u = fa[u][i]; } } if(u == v) { return u; } ; --i) { if(fa[u][i] != fa[v][i]) { u = fa[u][i]; v = fa[v][i]; } } ]; } int main(void) { scanf("%d%d%d", &n, &m, &rt), --rt; ; i < n-; ++i) { int u, v; scanf("%d%d", &u, &v), --u, --v; G[u].push_back(v); G[v].push_back(u); } dfs(rt, -, ); ; i < m; ++i) { int u, v; scanf("%d%d", &u, &v), --u, --v; printf(); } ; }