这题有个小坑,很荣幸踩了进去 就是ans得初始化必须是-inf , 各位可能会习惯性初始化为0

  • 思路就是只有子点与相连边的和>0就选择它,反之不选,一个假冒伪劣的树形dp 因为建立树时写成了v[b].push_back[b]导致查不出错误,下次直接把头剁了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+8;
ll n,dp[N],a,b,w,aa[N],ans;
vector<ll>v[N];
map<pair<ll,ll>,ll>mp;
void dfs(int cur,int fa){
    dp[cur]=aa[cur];
    for(int i=0;i<v[cur].size();i++){
        ll now = v[cur][i];
        //cout<<cur<<' '<<now<<' '<<fa<<endl;
        if(now==fa)continue;
        dfs(now,cur);
        if(dp[now]+mp[{cur,now}]>0){
            dp[cur]+=dp[now]+mp[{cur,now}];
        }
        ans=max(ans,dp[cur]);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>aa[i];
    for(int i=1;i<=n-1;i++){
        cin>>a>>b>>w;
        v[a].push_back(b);
        v[b].push_back(a);
        mp[{a,b}]=mp[{b,a}]=w;
    }
    dfs(1,0);
    cout<<ans<<endl;
    return 0;
}