以下代码可以通过
#include<bits/stdc++.h>
using namespace std;
const int maxn = 6e3+10;
int a[maxn], dis[maxn], head[maxn];
int n, ans1 = 0 , ans2 = 0 , len = 0;
struct Node {
int nxt, to;
} e[maxn << 1];
void add(int u, int v) {
e[++len].nxt = head[u];
e[len].to = v;
head[u] = len;
}
void dfs(int u, int fa, int dep) {
dis[u] = dep;
if(dep % 2==0) {
ans1 += a[u];
} else {
ans2 += a[u];
}
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(v==fa) {
continue;
}
dfs(v, u , dep+1);
}
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
a[i] = max(0, a[i]);
}
for(int i = 1, u, v; i <= n-1; ++i) {
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(1, 0, 1);
printf("%d", max(ans1, ans2));
return 0;
}
其思想如下图:

ans1 加单数层, ans2加双数层,遇到复数直接不加,即可通过。
如果加强代码,每遇到一个负数,重新定义 dep 值,则可以通过绝大多数的负数位置,但遇到以下样例就不合适了
10
2
2
1
5
2
2
2
1
1
4
1 3
2 3
3 5
4 5
4 6
4 7
6 8
8 9
9 10
若以前面的方式输出为 11,但正确答案为 14