dfs中在for循环前面一定要打初始化!(cpp dp[u] = a[u]
)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int to , nxt;
}e[16010];
int n , ans;
int a[16010];
int head[16010] , tot;
int dp[16010];
void add(int u , int v)
{
++ tot;
e[tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
}
void dfs(int u , int fa)
{
dp[u] = a[u]; // Au!!
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
if(v == fa) continue;
dfs(v , u);
dp[u] += (dp[v] > 0 ? dp[v] : 0);
}
}
int main()
{
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i ++)
scanf("%d" , &a[i]);
for(int i = 1 ; i < n ; i ++)
{
int u , v;
scanf("%d%d" , &u , &v);
add(u , v);
add(v , u);
}
dfs(1 , 0);
for(int i = 1 ; i <= n ; i ++)
ans = max(ans , dp[i]);
printf("%d" , ans);
return 0;
}