A. The Fair Nut and the Best Path ###K ###K //K
题目链接:https://codeforces.ml/problemset/problem/1083/A
题意:给定一棵树 每个节点和每条边都有权值,问如何选择一条路径使得 节点的权值-边权值最大,
并且在u-> v的过程中 权值-边权一定要≥0
思路:用树形dp dp[i] 为以i为根能走到的最远距离, 那么就能维护出来子树的一段路径,
我们再用ans 来维护一下分支 看两者合在一起是否能更大就能 保证了所有的路径
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=3e5+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define pi pair<int,int> 7 #define fi first 8 #define sc second 9 #define pb push_back 10 vector<pi>E[maxn]; 11 ll dp[maxn],a[maxn]; 12 ll ans; 13 14 void dfs(int u,int fa) 15 { 16 dp[u]=a[u]; 17 for(auto &v:E[u]) 18 { 19 if(v.fi==fa) continue; 20 dfs(v.fi,u); 21 ans=max(ans,dp[u]+dp[v.fi]-v.sc); 22 dp[u]=max(dp[u],a[u]+dp[v.fi]-v.sc); 23 } 24 ans=max(ans,dp[u]); 25 } 26 27 int main() 28 { 29 ios::sync_with_stdio(0); 30 cin.tie(0); 31 int n; 32 cin>>n; 33 for(int i=1;i<=n;i++) cin>>a[i]; 34 for(int i=1;i<n;i++) 35 { 36 int u,v,w; 37 cin>>u>>v>>w; 38 E[u].pb({v,w}); 39 E[v].pb({u,w}); 40 } 41 dfs(1,0); 42 cout<<ans<<'\n'; 43 44 45 46 47 48 }

浙公网安备 33010602011771号