【Codeforces 1083A】The Fair Nut and the Best Path
2024-08-30 15:20:30
【链接】 我是链接,点我呀:)
【题意】
题意
【题解】
我们最后要的是一条最长的路径。
这条路径的权值和是所有点的权值和-所有边的权值和且这个值最大。
显然如果我们在某一条边上的累计的权值和=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;
}
最新文章
- python django 多级业务树形结构规划及页面渲染
- MySQL安装常见问题(找不到文件,系统服务无法启动...)
- Xilinx命名规则
- (转载)全球唯一标识GUID
- SQL中Case When的使用方法
- validate()的配置项
- Oracle数据库悲观锁与乐观锁详解
- 不能完整读取txt文件问题
- 【转】Python爬虫:抓取新浪新闻数据
- oracle中创建数据库用户,并授权
- C#HTTP请求之POST请求和GET请求
- centos7.4+openvpn-2.4.4+easy-rsa-3.0
- mysql事务隔离级别及传播机制
- Redis学习-list数据类型
- 破解xlsm文件的VBA项目密码和xlsx的工作簿保护密码
- EntityFramework Core
- WPF如何为程序添加splashScreen(初始屏幕)
- WEB 自动化思路
- 操作Float的BigDecimal加减乘除
- 2018 Google SEO 需要注意的点