1 条题解

  • 0
    @ 2025-7-15 14:11:30

    朴素方法: 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
    上传者