题目描述
blablabla
样例
blablabla
算法1
(倍增法+LCA)
blablabla
时间复杂度
参考文献
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> tree[N];
int depth[N], parent[N][20];
int n, q;
void dfs(int u, int p) {
parent[u][0] = p;
depth[u] = depth[p] + 1;
for (int i = 1; i < 20; i++) {
parent[u][i] = parent[parent[u][i - 1]][i - 1];
}
for (int v : tree[u]) {
if (v != p) {
dfs(v, u);
}
}
}
int lca(int u, int v) {
if (depth[u] < depth[v]) swap(u, v);
for (int i = 19; i >= 0; i--) {
if (depth[parent[u][i]] >= depth[v]) {
u = parent[u][i];
}
}
if (u == v) return u;
for (int i = 19; i >= 0; i--) {
if (parent[u][i] != parent[v][i]) {
u = parent[u][i];
v = parent[v][i];
}
}
return parent[u][0];
}
int dist(int u, int v) {
int ancestor = lca(u, v);
return depth[u] + depth[v] - 2 * depth[ancestor];
}
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
tree[a].push_back(b);
tree[b].push_back(a);
}
// Preprocessing
dfs(1, 0);
cin >> q;
while (q--) {
int a, b;
cin >> a >> b;
cout << dist(a, b) << endl;
}
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla