D. Distance in Tree

https://codeforces.com/problemset/problem/161/D

题意:给一棵树,求树上距离为k的节点对的数量。

思路:树上dp,随便找个节点开始遍历。然后枚举当前点的距离为i的节点数与当前点的孩子节点距离为k - i - 1的节点数相乘。

总结:想到了树上dp,也想到了这个思路,但是没想到相乘跟开始遍历的节点值,以及为什么这种遍历可以保证节点对不重复。

void solve(){
    int n, k;
    cin >> n >> k;

    vector<vector<int>> al(n);
    for (int i = 0; i < n - 1; ++i){
        int u, v;
        cin >> u >> v;
        u --;
        v --;
        al[u].emplace_back(v);
        al[v].emplace_back(u);
    }

    long long ans = 0;
    vector<vector<long long>> dp(n, vector<long long>(k, 0ll));
    function<void(int, int)> dfs = [&](int u, int p){
        dp[u][0] = 1;
        for (const int& v : al[u]){
            if (v != p){
                dfs(v, u);
                for (int i = 0; i < k; ++i){
                    ans += dp[u][i] * dp[v][k - i - 1];
                }
                for (int i = 1; i < k; ++i){
                    dp[u][i] += dp[v][i - 1];
                }
            }
        }
    };

    dfs(0, -1);

    cout << ans << '\n';
}
posted @ 2024-04-29 14:55  _Yxc  阅读(16)  评论(0)    收藏  举报