『P1122』最大子树和

题目传送门

  输入样例

7
-1 -1 -1 1 1 1 0
1 4
2 5
3 6
4 7
5 7
6 7

   输出样例

3

  code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int fro[100005],cnt,n,v[100005],ans=0;
 4 struct node{int to,nxt;}a[100000];
 5 void add(int x,int y) {
 6     a[++cnt].to=y; a[cnt].nxt=fro[x]; fro[x]=cnt;
 7 }
 8 
 9 int dfs(int u,int fa) {
10     int f=v[u];
11     for(int i=fro[u];i!=0;i=a[i].nxt) {
12         int v=a[i].to;
13         if(v!=fa) f+=max(dfs(v,u),0);
14     }
15     ans=max(ans,f);
16     return f;
17 }
18 
19 int main() {
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++) scanf("%d",&v[i]);
22     for(int i=1;i<n;i++) {
23         int x,y; scanf("%d%d",&x,&y);
24         add(x,y); add(y,x);
25     }
26     dfs(1,0);
27     printf("%d",ans);
28 }
29 /*
30 树形DP
31 子树的取舍:取(加上价值),舍(价值为0)
32 */
posted @ 2018-12-19 20:15  YeLingqi  阅读(189)  评论(0编辑  收藏  举报