1 条题解
-
0
朴素方法: 70分,其余超时
#include <bits/stdc++.h> using namespace std; const int MAXN = 100000 + 5; vector<int> g[MAXN]; // 从 u 开始,沿树搜索 target; // p 是 u 的父节点,用来避免往回走。 // 若找到 target,返回 u 到 target 的距离;否则返回 -1。 int dfs_dist(int u, int target, int p) { if (u == target) return 0; for (int v : g[u]) { if (v == p) continue; int d = dfs_dist(v, target, u); if (d >= 0) // 在 v 的子树里找到了 return d + 1; } return -1; // 在以 u 为根的子树里没找到 } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; // 读边,建邻接表 for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } int Q; cin >> Q; while (Q--) { int x, y; cin >> x >> y; // 从 x 出发 DFS 找 y int ans = dfs_dist(x, y, 0); cout << ans << "\n"; } return 0; }
- 1
信息
- ID
- 1008
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者