树形dp

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 using namespace std;
 6 
 7 const int MAXN=(int)6e3+10;
 8 
 9 int n;
10 int r[MAXN];
11 bool flag[MAXN];
12 vector<int> vec[MAXN];
13 int dp[MAXN][2];   //i号职员去(1)或不去(0)的快乐指数
14 
15 void dfs(int u)
16 {
17     dp[u][0]=0;
18     dp[u][1]=r[u];
19     for (int i=0;i<(int)vec[u].size();i++)
20     {
21         int v=vec[u][i];
22         dfs(v);
23         //类似pushUp,求出子树的dp再向上更新根结点的dp
24         dp[u][0]+=max(dp[v][0],dp[v][1]);
25         dp[u][1]+=dp[v][0];
26     }
27     return;
28 }
29 
30 int main()
31 {
32     scanf("%d",&n);
33     for (int i=1;i<=n;i++) scanf("%d",&r[i]);
34     memset(flag,false,sizeof(flag));
35 
36     for (int i=1;i<n;i++)
37     {
38         int l,k;
39         scanf("%d%d",&l,&k);
40         vec[k].push_back(l);
41         flag[l]=true;
42     }
43 
44     int rt;
45     for (int i=1;i<=n;i++)   //求根结点(校长)
46     {
47         if (!flag[i])
48         {
49             rt=i;
50             break;
51         }
52     }
53 
54     dfs(rt);
55     printf("%d\n",max(dp[rt][1],dp[rt][0]));
56 
57     return 0;
58 }

 

posted @ 2021-12-05 09:51  Hell0er  阅读(33)  评论(0编辑  收藏  举报