P1352树形dp 0pts求助
#include<bits/stdc++.h>
using namespace std;
int r[6010],vi[6010],dp[6010][2];//dp[i][0]表示i不参加舞会最大快乐值 dp[i][1]表示i参加舞会最大快乐值
vector<int>G[6010];
void dfs(int x) {
dp[x][0] = 0;
dp[x][1] = r[x];
for (unsigned i = 0;i < G[x].size();i ++) {
int v = G[x][i];
dfs(v);
dp[x][0] += max(dp[v][0],dp[v][1]);
dp[x][1] += dp[v][0];
}
}
int main(){
int n;
cin >> n;
for (int i = 1;i <= n;i ++) cin >> r[i];
for (int i = 1;i < n;i ++) {
int u,v;
cin >> u >> v;
G[v].push_back(u);
vi[u] = 1;
}
int rt;
for (int i = 1;i <= n;i ++) {
if (!vi[i]) rt = i;
}
cout << rt << endl;
dfs(rt);
cout << max(dp[1][0],dp[1][1]) << endl;
return 0;
}