f[i]表示以i为根的子树的最大权值之和
状态转移:如果子节点及其子树权值和大于0,则加入父节点u的权值,即f[u] += f[son]。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std ;
const int N = 1e6 + 10 ;
typedef long long LL ;
vector<int> e[N] ;//用邻接表存储图
int w[N] ;
int n ;
LL res = 0 ;
LL f[N] ;
void dfs(int u , int fa){
f[u] = w[u]
for(int i = 0 ; i < e[u].size() ; i ++){
int j = e[u][i] ;
if(j != fa){//不回走父结点
dfs(j,u) ;
if(f[j] > 0 ) f[u] += f[j] ;
}
}
//res = max(res,f[u]);
}
int main(){
cin >> n ;
for(int i = 1 ; i <= n ;i ++) cin >> w[i] ;
for(int i = 1 ; i < n ; i ++){
int a , b ; cin >> a >> b ;
e[a].push_back(b) ; e[b].push_back(a) ;
}
dfs(1,-1) ;//任选一个结点进行dfs
for(int i = 1 ; i <= n ; i ++) res = max(res,f[i]);
cout << res << endl ;
}