#include<bits/stdc++.h>
using namespace std;
#define int long long
#define gcd(a, b) __gcd(a,b)
const long long mod = 1e9 + 7;
const int maxn = 4e4 + 5;
int dp[maxn][3];
int a[maxn];
vector<int> g[maxn];
void dfs(int u, int f) {
//
// dp[u][0] = max(dp[f][0], dp[f][1]);
// dp[u][1] = dp[f][0] + a[u];
int len = g[u].size();
if (len == 1 && u != 1) {
dp[u][1] = a[u];
dp[u][0] = 0;
}
dp[u][1]=a[u];
for (int i = 0; i < len; ++i) {
if (g[u][i] != f) {
dfs(g[u][i], u);
dp[u][0] += max(dp[g[u][i]][0], dp[g[u][i]][1]);
dp[u][1] += dp[g[u][i]][0] ;
}
}
}
signed main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
int q, w;
cin >> q >> w;
g[q].push_back(w);
g[w].push_back(q);
}
dp[1][0] = 0;
dp[1][1] = a[1];
dfs(1, 0);
int ans = -1000000;
cout << max(dp[1][1], dp[1][0]) << endl;
return 0;
}
树形DP 没有上司的舞会
最新推荐文章于 2022-02-26 21:49:04 发布