1. 程式人生 > >『P1122』最大子樹和

『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 */