『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 */
如有错误请指正。