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 }
View Code

 

posted @ 2021-02-22 18:52  canwinfor  阅读(38)  评论(0)    收藏  举报