1 条题解
-
0
参考答案:
#include<iostream> #include<queue> #include<cstring> using namespace std; const int N = 40010 * 2, M = 17; int e[N], ne[N], h[N], idx; int f[N][M]; int depth[N]; int st[N]; int n, m; queue<int> q; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; } void bfs(int root) { depth[0] = 0, depth[root] = 1; q.push(root); st[root] = 1; while (q.size()) { int t = q.front(); q.pop(); for (int i = h[t]; ~i; i = ne[i]) { int j = e[i]; if (!st[j]) { depth[j] = depth[t] + 1; f[j][0] = t; for (int k = 1; k <= 16; ++k) { f[j][k] = f[f[j][k - 1]][k - 1]; } q.push(j); st[j] = 1; } } } } int lca(int a, int b) { if (depth[a] < depth[b]) swap(a, b); for (int k = 16; k >= 0; --k) { if (depth[f[a][k]] >= depth[b]) a = f[a][k]; } if (a == b) return a; for (int k = 16; k >= 0; --k) { if (f[a][k] != f[b][k]) { a = f[a][k]; b = f[b][k]; } } return f[a][0]; } int main() { memset(h, -1, sizeof(h)); cin >> n; int root = 0; for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; if (b == -1) { root = a; continue; } add(a, b); add(b, a); } bfs(root); cin >> m; for (int i = 0; i < m; ++i) { int x, y; cin >> x >> y; int p = lca(x, y); if (p == x) puts("1"); else if (p == y) puts("2"); else puts("0"); } return 0; }
- 1
信息
- ID
- 1491
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 5
- 已通过
- 2
- 上传者