这个代码可以过
```cpp
#include<bits/stdc++.h>
#define mx 16002
int head[mx],dp[mx],a[mx];
int n,m,cnt,k=-2147483647;
std::vector<int> ed[mx];
void dfs(int nr,int nf)
{
dp[nr]=a[nr];
for(int i=0;i<ed[nr].size();i++)
{
int to=ed[nr][i];
if(to==nf)continue;
dfs(to,nr);
if(dp[to]>0)dp[nr]+=dp[to];
}
}
int main()
{
int i,x,y;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
ed[x].push_back(y);
ed[y].push_back(x);
}
dfs(1,-1);
for(i=1;i<=n;i++)
if(dp[i]>k)k=dp[i];
printf("%d",k);
return 0;
}
```
by RNTBW @ 2022-03-27 21:48:50
@[lice1211](/user/157052) 确实啊,设置的测试点都是单向的,按照题目意思是双向才对,估计是洛谷官方搞错了,我的代码就是双向的,输出就是2002,之前写了一个单向的测试数据反过来输出就不对。
by JimbaPapagei @ 2022-04-10 17:25:27
应该是已经加强了,单向建边WA 10pts:
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e4;
const int INF = 0x3f3f3f3f;
int n, a[MAXN], head[MAXN << 1], nxt[MAXN << 1], to[MAXN << 1], f[MAXN], tot;
inline void link(int u, int v)
{
to[tot] = v;
nxt[tot] = head[u];
head[u] = tot++;
}
void dfs(int p, int r)
{
f[p] = a[p];
for (int i = head[p]; ~i; i = nxt[i])
if (to[i] != r)
{
dfs(to[i], p);
if (f[to[i]] > 0)
f[p] += f[to[i]];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
memset(head, -1, sizeof(head));
int u, v;
for (int i = 1; i < n; i++)
{
cin >> u >> v;
link(u, v);
//这里加上link(v,u)能AC
}
dfs(1, 0);
int ans = -INF;
for (int i = 1; i <= n; i++)
ans = max(ans, f[i]);
cout << ans;
return 0;
}
```
by creation_hy @ 2022-09-15 13:12:14
@[creation_hy](/user/576378) az好像并没有。。。我的[单向边](https://www.luogu.com.cn/record/122135265)刚过了
by lxyt_415x @ 2023-08-21 21:19:30