7
2025-08-16 11:07:56
发布于:浙江
2阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 105;
vector<int> tree[MAXN];
int val[MAXN];
int dp[MAXN][2]; // dp[u][0]:不选u, dp[u][1]:选u
void dfs(int u, int parent) {
dp[u][1] = val[u]; // 选择当前节点的初始值
for (int v : tree[u]) {
if (v == parent) continue;
dfs(v, u);
dp[u][1] += max(0, dp[v][0]); // 保证连通性
dp[u][0] += max(dp[v][0], dp[v][1]);
}
}
int main() {
int n;
cin >> n;
// 读取节点值
for (int i = 1; i <= n; ++i) {
cin >> val[i];
}
// 建树
for (int i = 1; i < n; ++i) {
int u, v;
cin >> u >> v;
tree[u].push_back(v);
tree[v].push_back(u);
}
// 从根节点开始DFS(任意节点均可,这里选1)
dfs(1, -1);
// 最终结果是选或不选根节点的最大值
cout << max(dp[1][0], dp[1][1]) << endl;
return 0;
}
这里空空如也
有帮助,赞一个