http://poj.org/problem?id=2342

树形dp:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 
 7 const int mx=6006;
 8 int dp[mx][2];
 9 vector<int>g[mx];
10 int n;
11 
12 void dfs(int x)
13 {
14    for (int i=0;i<g[x].size();i++)
15    {
16        int j=g[x][i];
17        dfs(j);
18        dp[x][1]+=dp[j][0];
19        dp[x][0]+=max(dp[j][1],dp[j][0]);
20    }
21 }
22 
23 int main()
24 {
25     while (~scanf("%d",&n))
26     {
27         if (!n)
28         {
29             scanf("%d",&n);
30             if (!n) return 0;
31         }
32         memset(dp,0,sizeof(dp));
33         for (int i=1;i<=n;i++) scanf("%d",&dp[i][1]),g[i].clear();
34         int l,k,root=1;
35         for (int i=1;i<n;i++)
36         {
37             scanf("%d%d",&l,&k);
38             g[k].push_back(l);
39             if (root==l) root=k;
40         }
41         dfs(root);
42         printf("%d\n",max(dp[root][1],dp[root][0]));
43     }
44     return 0;
45 }

 

posted on 2016-03-08 13:55  pb2016  阅读(174)  评论(0编辑  收藏  举报