这题有个小坑,很荣幸踩了进去 就是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;
}