【链接】 我是链接,点我呀:)

【题意】

题意

【题解】

我们最后要的是一条最长的路径。
这条路径的权值和是所有点的权值和-所有边的权值和且这个值最大。
显然如果我们在某一条边上的累计的权值和=0)
所以如果我们求的是最大的权值和-边权和的话,那么求出来的路径一定不会有中间某个地方走着走着没油的情况
因此我们只要按照树上最长链的类似方法。
求出来,从i的不同子树下的节点到达i节点的点权和减去边权和的最大值和次小值。
对于所有的点,用这两个值的和尝试更新答案即可。

【代码】

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 3e5; int n;
int a[N+10];
ll f[N+10][2],ans=0; vector<pair<int,int> > g[N+10]; void dfs(int x,int pre){
int len = g[x].size();
f[x][0] = a[x];
for (int i = 0;i < len;i++){
int y = g[x][i].first,cost = g[x][i].second;
if (y==pre) continue;
dfs(y,x);
if (f[x][0]<f[y][0]-cost+a[x]){
f[x][1] = f[x][0];
f[x][0] = f[y][0]-cost+a[x];
}else{
if (f[x][1]<f[y][0]-cost+a[x]){
f[x][1] = f[y][0]-cost+a[x];
}
}
}
if (f[x][1]>0){
ans = max(ans,f[x][0]+f[x][1]-a[x]);
}else ans = max(ans,f[x][0]); } int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for (int i = 1;i <= n;i++) cin >>a[i];
for (int i = 1;i <= n-1;i++){
int x,y,z;
cin >> x >> y >> z;
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dfs(1,-1);
cout<<ans<<endl;
return 0;
}

最新文章

  1. python django 多级业务树形结构规划及页面渲染
  2. MySQL安装常见问题(找不到文件,系统服务无法启动...)
  3. Xilinx命名规则
  4. (转载)全球唯一标识GUID
  5. SQL中Case When的使用方法
  6. validate()的配置项
  7. Oracle数据库悲观锁与乐观锁详解
  8. 不能完整读取txt文件问题
  9. 【转】Python爬虫:抓取新浪新闻数据
  10. oracle中创建数据库用户,并授权
  11. C#HTTP请求之POST请求和GET请求
  12. centos7.4+openvpn-2.4.4+easy-rsa-3.0
  13. mysql事务隔离级别及传播机制
  14. Redis学习-list数据类型
  15. 破解xlsm文件的VBA项目密码和xlsx的工作簿保护密码
  16. EntityFramework Core
  17. WPF如何为程序添加splashScreen(初始屏幕)
  18. WEB 自动化思路
  19. 操作Float的BigDecimal加减乘除
  20. 2018 Google SEO 需要注意的点

热门文章

  1. 使用Ctex中遇到的一些问题
  2. 洛谷p1115 最大子段和
  3. vmware虚拟机启动centOs黑屏
  4. 香港药品 ref
  5. RHEL 7.2 源码安装Python 3.6.2报错
  6. 项目错误提示Multiple markers at this line
  7. mongoDB内置文档定义
  8. [转].NET MVC 分页以及增删查改
  9. Java基础学习-一切皆为对象
  10. AJPFX总结jvm运行时内存分布