树形DP hdu1520

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int fro,to,next;
 9 }e[36000000];
10 int dp[6000][2];
11 int num=0;
12 int head[6000];
13 int val[6000];
14 bool isye[6000];
15 
16 void addEdge(int _fro,int _to)
17 {
18     num++;
19     e[num].fro=_fro;
20     e[num].to=_to;
21     e[num].next=head[_fro];
22     head[_fro]=num;
23 }
24 
25 int dfs(int x)
26 {
27     dp[x][0]=0;
28     dp[x][1]=val[x];
29     for(int i=head[x];i!=-1;i=e[i].next)
30     {
31         int v=e[i].to;
32         dfs(v);
33         dp[x][0]+=max(dp[v][0],dp[v][1]);
34         dp[x][1]+=dp[v][0];
35     }
36     return max(dp[x][0],dp[x][1]);
37 }
38 
39 int main()
40 {
41     int n;
42     while(scanf("%d",&n)!=EOF)
43     {
44         for(int i=1;i<=n;i++)
45         {
46             scanf("%d",&val[i]);
47         }
48         int a,b;
49         for(int i=0;i<=n;i++)
50         {
51             head[i]=-1;
52             isye[i]=true;
53         }
54         while(scanf("%d%d",&a,&b)!=EOF)
55         {
56             if(a==0&&b==0)
57                 break;
58             addEdge(b,a);
59             isye[a]=false;
60         }
61         for(int i=1;i<=n;i++)
62         {
63             if(isye[i])
64             {
65                 cout<<dfs(i)<<endl;
66             }
67         }
68     }
69     return 0;
70 }
View Code

 

posted @ 2015-08-29 09:46  相儒以沫  阅读(157)  评论(0编辑  收藏  举报