树形dp

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=6010;
 6 int f[N][2],w[N],in[N],out[N],n;
 7 int head[N],nxt[N],son[N],size;
 8 void uni(int x,int y){
 9     size++;
10     nxt[size]=head[x];
11     head[x]=size;
12     son[size]=y;
13     in[x]++;
14     out[y]++;
15 }
16 int dp(int x,int k){
17     int &ans=f[x][k];
18     if (ans)
19         return ans;
20     if (!in[x]){
21         if (!k)
22             return ans=0;
23         else
24             return ans=w[x];
25     }
26     if (k)
27         ans=w[x];
28     else
29         ans=0;
30     if (k)
31         for (int e=head[x];e;e=nxt[e]){
32             int y=son[e];
33             ans+=dp(y,1-k);
34         }
35     else
36         for (int e=head[x];e;e=nxt[e]){
37             int y=son[e];
38             int r1=dp(y,1-k);
39             int r2=dp(y,k);
40             ans+=max(r1,r2);
41         }
42     return ans;
43 }
44 int main(){
45     int k,l;
46     memset(f,0,sizeof(f));
47     size=0;
48     scanf("%d",&n);
49     for (int i=1;i<=n;i++)
50         scanf("%d",&w[i]);
51     for (int i=1;i<=n;i++){
52         scanf("%d %d",&l,&k);
53         if (l&&k)
54             uni(k,l);
55     }
56     for (int i=1;i<=n;i++)
57         if (!out[i])
58             uni(0,i);
59     printf("%d",dp(0,0));
60     return 0;
61 }
STD

 

posted on 2016-11-07 17:55  Absolutezero  阅读(185)  评论(0)    收藏  举报