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 @   _Yxc  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示