Codeforces Round #526 D - The Fair Nut and the Best Path /// 树上两点间路径花费
题目大意:
给定一棵树 树上每个点有对应的点权
树上每条边有对应的边权
经过一个点可得到点权 经过一条边必须花费边权
即从u到v 最终得分=u的点权-u到v的边权+v的点权
求树上一条路径使得得分最大
看注释
#include <bits/stdc++.h>
#define LL long long
#define INf 0x3f3f3f3f
using namespace std;
const int N=3e5+;
bool vis[N];
LL w[N], ans;
int n;
struct NODE { int to,nt; LL l; }e[N<<];
int head[N], tot;
void addE(int u,int v,LL l) {
e[tot].to=v, e[tot].l=l;
e[tot].nt=head[u];
head[u]=tot++;
}
void init() {
memset(head,,sizeof(head));
tot=;
}
LL dfs(int u,int fa) {
vis[u]=;
LL ans1=0LL, ans2=0LL;
// ans1由子节点出发的一条路径最大得分 ans2为次大
for(int i=head[u];i;i=e[i].nt) {
int v=e[i].to;
if(v==fa || vis[v]) continue;
LL tmp=dfs(v,u)-e[i].l;
if(tmp>ans1) swap(tmp,ans1);
if(tmp>ans2) swap(tmp,ans2);
}
ans=max(ans,ans1+ans2+w[u]);
// 可由最大得分和次大得分加上u点 得到一条经过u点的路径的最大得分
return ans1+w[u]; // 只返回由u出发的一条路径可得到的最大得分
}
int main()
{
while(~scanf("%d",&n)) {
for(int i=;i<=n;i++) scanf("%I64d",&w[i]);
init();
for(int i=;i<n;i++) {
int u,v; LL l;
scanf("%d%d%I64d",&u,&v,&l);
addE(u,v,l); addE(v,u,l);
}
memset(vis,,sizeof(vis));
ans=0LL;
dfs(,);
printf("%I64d\n",ans);
} return ;
}
Codeforces Round #526 D - The Fair Nut and the Best Path /// 树上两点间路径花费的更多相关文章
- Codeforces Round #526 C - The Fair Nut and String /// 组合递推
题目大意: 给定原字符序列 找出其中所有子序列满足 1.序列内字符都为a 2.若有两个以上的字符 则相邻两个字符在原序列中两者之间存在字符b 的数量 将整个字符序列用b分开 此时再得到每个b之间a的数 ...
- Codeforces Round #526 (Div. 2) D. The Fair Nut and the Best Path 树上dp
D. The Fair Nut and the Best Path 题意:给出一张图 点有权值 边也要权值 从任意点出发到任意点结束 到每个点的时候都可以获得每个点的权值,而从边走的时候都要消耗改边的 ...
- CodeForces 1084D The Fair Nut and the Best Path
The Fair Nut and the Best Path 题意:求路径上的 点权和 - 边权和 最大, 然后不能存在某个点为负数. 题解: dfs一遍, 求所有儿子走到这个点的最大值和次大值. 我 ...
- Codeforces Round #526 (Div. 2) D. The Fair Nut and the Best Path
D. The Fair Nut and the Best Path 题目链接:https://codeforces.com/contest/1084/problem/D 题意: 给出一棵树,走不重复的 ...
- Codeforces Round #526 (Div. 2) Solution
A. The Fair Nut and Elevator Solved. 签. #include <bits/stdc++.h> using namespace std; #define ...
- Codeforces Round #526 (Div. 1)
毕竟是上紫之后的第一场div1,还是太菜了啊,看来我要滚回去打div2了. A. The Fair Nut and the Best Path 这题本来是傻逼贪心dfs,结果我越写越麻烦,然后就只有1 ...
- CF 1083 A. The Fair Nut and the Best Path
A. The Fair Nut and the Best Path https://codeforces.com/contest/1083/problem/A 题意: 在一棵树内找一条路径,使得从起点 ...
- CF1083A The Fair Nut and the Best Path
CF1083A The Fair Nut and the Best Path 先把边权搞成点权(其实也可以不用),那么就是询问树上路径的最大权值. 任意时刻权值非负的限制可以不用管,因为若走路径 \( ...
- Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和
Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和 [Problem Description ...
随机推荐
- python pandas 使用列表快速创建数据 用于测试
创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...
- Dubbo入门到精通学习笔记(五):持续集成管理平台之sonarqube代码质量管理平台的介绍与安装
文章目录 SonarQube的介绍 SonarQube的安装 安装简介 详细安装过程 详细使用过程 SonarQube的介绍 SonarQube是一个管理代码质量的开放平台. 可以从七个维度检测代码质 ...
- 剑指offer——47把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题解: ...
- 初探Javascript魅力(1)
转自:CSDN--http://blog.csdn.net/cherry_vicent/article/details/42120149 1.javascript是什么 根据用户的一些操作,然后来 ...
- element ui 弹出组件的遮罩层在弹出层的上面的解决方法
<el-dialog title="收货地址" :visible.sync="dialogFormVisible" :modal-append-to-bo ...
- 初识 flex 布局
开启弹性盒模式: display:flex / inline-flex: inline-flex 行内弹性盒 1.设置 flex 缩放的 限定值 min-width 最小值 min-wi ...
- 获取url链接上的参数值的函数
function getUrlParam(name){ var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); var ...
- 关于windows cmd的一些便捷应用
在同事的指点下,我学会了一种非常方便的进入路径的方法 在windows文件夹中直接打开到要执行的文件的位置,然后在我的电脑那个路径当中输入cmd 之后,cmd的对话框会弹出来,并且显示在当前路径下,这 ...
- 错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算
问题描述:错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算 原因描述:一.首先我的系统是因为是win10 的有问题,重新装了系统. 二. ...
- vue生态系统之vuex
一.webpack生成项目 1.webpack 在需要建立项目的目录中进行初始化项目 E:\vueProject>vue init webpack vuexpj ? Project name v ...