WA23pts求助,马蜂十分甚至九分的良好
查看原帖
WA23pts求助,马蜂十分甚至九分的良好
747464
_3145114514_楼主2024/10/8 20:42

求调qwq

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define TLE                      \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
#define endl "\n"
#define sp system("pause")
const int inf = 0x3f3f3f3f;
const int INF = 0x7fffffff;
const ll infll = 0x3f3f3f3f3f3f3f3f;
const ll INFll = 0x7fffffffffffffff;
const int maxn = 1e3 + 5;
const double pi = acos(-1.0);
const double eps = 1e-5;
/*
有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点)树根编号1

现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。

给定需要保留的树枝数量,求出最多能留住多少苹果。
*/
// 设dp[u][i]表示u的子树上保留i条边,至多保留的苹果数目
// dp[u][i] = max dp[u][i - j - 1] + dp[s][j] j in min(1~v(s).size,q) s in u->son
int n, q;
vector<pair<int, int>> v[maxn];
ll dp[1005][1005];
int siz[1005];
void dfs1(int u, int fa)
{
    for (int i = 0; i < (int)v[u].size(); i++)
    {
        if (v[u][i].first != fa)
        {
            dfs1(v[u][i].first, u);
        }
    }
    for (int i = 0; i < v[u].size(); i++)
    {
        for (int j = min(siz[u], q); j >= 0; j--)
        {
            for (int k = min(siz[v[u][i].second], j - 1); k >= 0; k--)
            {
                dp[u][j] = max(dp[u][j], dp[u][j - k - 1] + dp[v[u][i].first][k] + v[u][i].second);
            }
        }
    }
    return;
}
void dfs2(int u, int fa)
{
    for (int i = 0; i < v[u].size(); i++)
    {
        if (v[u][i].first != fa)
        {
            dfs2(v[u][i].first, u);
        }
    }
    siz[u] = 1;
    for (int i = 0; i < v[u].size(); i++)
    {
        if (v[u][i].first != fa)
        {
            siz[u] += siz[v[u][i].first];
        }
    }
    return;
}
int main()
{
    cin >> n >> q;
    for (int i = 1; i < n; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        v[x].push_back(make_pair(y, z));
        v[y].push_back(make_pair(x, z));
    }
    dfs2(1, -1);
    // for (int i = 1; i <= n; i++)
    // {
    //     cout << siz[i] << " ";
    // }
    // sp;
    dfs1(1, -1);
    cout << dp[1][q];
    //sp;
    return 0;
}
2024/10/8 20:42
加载中...