1 条题解

  • 0
    @ 2025-5-24 9:13:07
    #include <bits/stdc++.h>
    using namespace std;
    int n, q;
    int dp[105][105]; // dp[i][j] 子树i保留j条边最多多少苹果
    struct Edge
    {
        int v, w;
    };
    vector<Edge> e[105];
    void dfs(int u, int fa)
    {
        dp[u][0] = 0;
        for (int i = 0; i < e[u].size(); i++)
        {
            int v = e[u][i].v;
            int w = e[u][i].w;
            if (v == fa)
                continue;
            dfs(v, u);
            for (int j = q; j >= 0; j--) // u之前保留j条边
            {
                for (int k = 0; k + j + 1 <= q; k++) // v提供多少条边
                {
                    //隐含条件:选择v下面的边时,u-v 之间的这条边包括进来了
                    dp[u][j + k + 1] = max(dp[u][j + k + 1],
                                           dp[u][j] + dp[v][k] + w);
                }
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> q;
        for (int i = 1; i <= n - 1; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u].push_back((Edge){v, w});
            e[v].push_back((Edge){u, w});
        }
        dfs(1, 0);
        /*
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j <= q; j++)
                cout << dp[i][j] << " ";
            cout << "\n";
        }
        */
        cout << dp[1][q] << "\n";
        return 0;
    }
    

    信息

    ID
    2765
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    23
    已通过
    17
    上传者