Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9361 Accepted Submission(s): 4016
1 # include <iostream> 2 # include <cstring> 3 # include <cstdio> 4 using namespace std; 5 const int MAX = 6010; 6 struct node 7 { 8 int is; 9 int next; 10 }; 11 node tree[MAX * 2]; 12 int head[MAX]; 13 int tol = 0; 14 15 int dp[MAX][2]; 16 int vis[MAX]; 17 int val[MAX]; 18 19 void add(int a, int b) 20 { 21 tree[tol].is = b; 22 tree[tol].next = head[a]; 23 head[a] = tol++; 24 25 tree[tol].is = a; 26 tree[tol].next = head[b]; 27 head[b] = tol++; 28 } 29 void dfs(int root) 30 { 31 if(vis[root]) 32 return; 33 vis[root] = 1; 34 int tep = head[root]; 35 dp[root][1] = val[root]; 36 37 while(tep != -1) 38 { 39 if(!vis[tree[tep].is]) 40 { 41 dfs(tree[tep].is); 42 dp[root][0] += max(dp[tree[tep].is][0], dp[tree[tep].is][1]); 43 dp[root][1] += dp[tree[tep].is][0]; 44 } 45 tep = tree[tep].next; 46 } 47 } 48 int main() 49 { 50 int n; 51 while(~scanf("%d", &n)) 52 { 53 memset(head, -1, sizeof(head)); 54 memset(dp, 0, sizeof(dp)); 55 memset(vis, 0, sizeof(vis)); 56 tol = 0; 57 for(int i = 0; i < MAX; i++) 58 { 59 tree[i].is = 0; 60 tree[i].next = -1; 61 } 62 for(int i = 1; i <= n; i++) 63 scanf("%d", &val[i]); 64 65 int a, b; 66 67 while(scanf("%d%d", &a, &b)) 68 { 69 if(a == 0 && b == 0) 70 break; 71 add(a, b); 72 } 73 dfs(1); 74 printf("%d\n", max(dp[1][1], dp[1][0])); 75 } 76 return 0; 77 }
原文:http://www.cnblogs.com/lyf-acm/p/5789707.html