点击跳转、
思路是直接开始递归找边,如果这个点与他的子边是负数,那么就不要了,否则就要他。以做到最大 用到双向存边,防止回传(TLE)
#include<bits/stdc++.h>
#define INF 0x7FFFFFFF
#define N 16100
using namespace std;
vector<int>q[N];
int temp1,temp2,f[N],r[N],ans=-INF,n;
void dp(int x,int dad)
{
f[x]=r[x];
for (int i = 0; i < q[x].size(); i++)
{
int y=q[x][i];
if (y!=dad)
{
dp(y,x);
if (f[y]>0)
{
f[x]+=f[y];
}
}
}
}
int main()
{
scanf("%d",&n);
for (int i = 1; i <= n; i++)
scanf("%d",&r[i]);
for (int i = 1; i <= n-1; i++)
{
scanf("%d%d",&temp1,&temp2);
q[temp1].push_back(temp2);
q[temp2].push_back(temp1);
}
dp(1,0);
for (int i = 1; i <= n; i++)
ans=max(ans,f[i]);
cout<<ans;
return 0;
}