P1352 没有上司的舞会

题意:你猜

思路:一个点可选可不选,那么假如选,下属就只有一种情况

              假如不选,下属就有两种情况,一种选,一种不选

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=6e3+10;
 4 int a[maxn];
 5 int dp[maxn][2];
 6 int vis[maxn];
 7 struct node
 8 {
 9     int v,nxt;
10 }G[maxn*2];
11 int head[maxn]; int num;
12 void add(int u,int v)
13 {
14     G[++num].v=v;G[num].nxt=head[u];head[u]=num;
15 }
16 void dfs(int u)
17 {
18     dp[u][0]=0;dp[u][1]=a[u];
19     for(int i=head[u];i;i=G[i].nxt){
20         int v=G[i].v;
21         dfs(v);
22         dp[u][0]+=max(dp[v][1],dp[v][0]);
23         dp[u][1]+=dp[v][0];
24     }
25 }
26 int main()
27 {
28     int n;
29     scanf("%d",&n);
30     int rt;
31     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
32     for(int i=1;i<n;i++){
33         int u,v;
34         scanf("%d%d",&u,&v);
35         add(v,u);
36         vis[u]++;
37     }
38     for(int i=1;i<=n;i++){
39         if(!vis[i]){
40             rt=i;
41             break;
42         }
43     }
44     dfs(rt);
45     printf("%d\n",max(dp[rt][1],dp[rt][0]));
46 }
View Code

 

posted @ 2020-03-30 21:36  古比  阅读(200)  评论(0编辑  收藏  举报