比赛 20250527树形DP练习 评测结果
题目名称 外卖 最终得分 0
用户昵称 XZDZD 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2025-05-07 21:34:43
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
const int N = 521;
using namespace std;
int n, m;
int v[N];
int sz[N];
int f[521][521][3];
vector <int> G[N];
void dp (int u, int fa) {
    sz[u] = 1;f[u][1][0] = v[u];f[u][1][1] = v[u];
	for (auto v : G[u]) {
		if (v == fa) continue;
        dp(v, u);
        sz[u] += sz[v];
        for (int i = min (m,3*sz[u]); i; --i) {
            for (int j = 1; j < min(m,3 * sz[v]); ++j) {
                if (i - j - 2 >= 0) {
                    f[u][i][1] = max(f[u][i][1], f[v][j][0] + f[u][i - j - 2][1]);
                    f[u][i][0] = max(f[u][i][0], f[v][j][0] + f[u][i - j - 2][1]);                    
                }
                f[u][i][1] = max(f[u][i][1], f[v][j][1] + f[u][i - j - 1][0]);
            }
        }
	}
}
int main() {
    freopen("food.in","r",stdin);
    freopen("food.out","w",stdout);

	cin >> n >> m;

	for (int i = 1;i <= n; ++i) cin >> v[i];

	for (int i = 1; i <= m; ++i) {
		int u, v; cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	int ans = 0;
    dp(1, 0);
    for (int i = 1; i <= n; ++i) ans = max ({ans,f[1][i][1],f[1][i][0]});
    cout << ans;
	return 0;
}