没有上司的舞会,树形dp
#include<bits/stdc++.h> #define mms(a) memset(a,-1,sizeof(a)) using namespace std; int dp[6010][2],fr[6010]; #dp[i][1]表示该节点参加舞会时,该子树的最大值 vector<int> v[6010]; int dfs(int next){ for(int i=0;i<v[next].size();i++){ dfs(v[next][i]); dp[next][0]+=max( dp[ v[next][i] ][1],dp[ v[next][i] ][0] ); dp[next][1]+=dp[ v[next][i] ][0]; } return 0; } int main(){ int n,root; cin>>n; for(int i=1;i<=n;i++){ dp[i][0]=0; scanf("%d",&dp[i][1]); v[i].clear(); fr[i]=0; } int b,c; for(int i=1;i<n;i++){ cin>>c>>b; v[b].push_back(c); fr[c]=1; } cin>>b>>c; for(int i=1;i<=n;i++){ if(!fr[i]){ root=i; break; } } dfs(root); cout<<max(dp[root][1],dp[root][0])<<endl; return 0; }