https://codeforces.com/problemset/problem/1083/A


题意:到达一个点得到这个点的价值,经过一个边花费这个边的价值,求得到的最大价值


思路:之前碰过一些无根树的问题,有些是直接定1为根就可以了不用考虑其他,但是有些不行。比如树的重心,一种方法是定1为根然后考虑dp转移过程中该节点“头上”的量。比如树的直径,确实可以两次dfs求,树形dp的求法也是类似考虑节点“头上”的量。

这题是个无根树,考虑头上的量。

先考虑以u为根节点的子树,

1.u是起点,那么就是u在子树中所能获得的最大价值

2.u是转折点,那么就是u在子树中获得的最大价值与次大价值之和

这个转折点的意思是,出现了一个类似倒V形状,注意这道题的一个要求是路径是简单路径,也就是没有重边和自环

然后考虑u通过父亲所能获得的最大价值与u在子树中所能获得的最大价值之和

类似树的直径问题。

这里注意通过fa[u]获得的最大价值,是不会以u作为转折点获得的,因为转折点的话就已经完成了简单路径,要走上去的话要回走一条重边。

然后发现 u通过父亲fa所能获得的最大价值与u在子树中所能获得的最大价值之和 其实已经被

以fa为转折点(我的理解)在子树中所能获得的最大价值 所包括

而在dp的转移中,用dp[]维护的是u为起点的最大价值,怎么取u为转折点呢?用一个ans去维护ans=max(ans,dp[u]+dp[v]-cost);

这个ans的右边的值就是一个倒V的值,取且只能取一个最大的。

dp的转移也是转移以u为起点的最大价值,是一条直着的路径,不会转折。

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=3e5+100;
typedef long long LL;
LL val[maxn],dp[maxn],ans;
vector< pair<LL,LL> >g[maxn];
void dfs(LL u,LL fa)
{dp[u]=val[u];ans=max(ans,dp[u]);for(LL i=0;i<g[u].size();i++){LL v=g[u][i].first;LL w=g[u][i].second;if(v==fa) continue;dfs(v,u);ans=max(ans,dp[u]+dp[v]-w);dp[u]=max(dp[u],dp[v]+val[u]-w); }
}
int main(void)
{cin.tie(0);std::ios::sync_with_stdio(false);LL n;cin>>n;for(LL i=1;i<=n;i++) cin>>val[i];for(LL i=1;i<n;i++){LL x,y,w;cin>>x>>y>>w;g[x].push_back({y,w});g[y].push_back({x,w});} dfs(1,0);cout<<ans<<endl;
return 0;
}

A. The Fair Nut and the Best Path(无根树dp详解)相关推荐

  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 题意: 在一棵树内找一条路径,使得从起点 ...

  2. CF1083A The Fair Nut and the Best Path

    CF1083A The Fair Nut and the Best Path 先把边权搞成点权(其实也可以不用),那么就是询问树上路径的最大权值. 任意时刻权值非负的限制可以不用管,因为若走路径 \( ...

  3. 【CodeForces - 1084D】The Fair Nut and the Best Path (树形dp)

    题干: The Fair Nut is going to travel to the Tree Country, in which there are nn cities. Most of the l ...

  4. CodeForces 1084D The Fair Nut and the Best Path(树形dp)

    题目描述 The Fair Nut is going to travel to the Tree Country, in which there are n cities. Most of the l ...

  5. 【Codeforces 1083A】The Fair Nut and the Best Path

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们最后要的是一条最长的路径. 这条路径的权值和是所有点的权值和-所有边的权值和且这个值最大. 显然如果我们在某一条边上的累计的权值和< ...

  6. codeforces 1083 A. The Fair Nut and the Best Path(树形dp)

    题目大意: 每个节点都给定一个值a[i],从一个节点走到另一个节点会消耗固定值w,但也会得到这个节点的价值,问怎样走才能得到最大的价值. 解题思路: 这个题和树形dp求树的直径差不多(树形DP基本都是 ...

  7. python3 join函数_Python3 join函数和os.path.join用法详解

    #Python3#author:lim#date:2019-01-14 #1.对数组进行操作 seq1 = ['hello','good','boy','doiido'] msg1= ' '.join ...

  8. python os.path模块常用方法详解

    os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法.更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.ht ...

  9. linux find prune文件,Linux中find命令-path -prune用法详解

    在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能. 假如在当前目录下 ...

最新文章

  1. 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告...
  2. SAP LSMW Standard Batch (Direct) Input 方式制作的LSMW工具导入OPEN PO 单据时候’税码’字段的处理
  3. python入门(12)dict
  4. [codevs 1922] 骑士共存问题
  5. UIApplication,UIWindow,UIViewController,UIView(layer)
  6. oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)
  7. Android 第十六课 使用LitePal查询数据
  8. lambda 两个list获取交集_《Java8 实战》笔记 - Lambda 表达式
  9. 在DevStack中使用Systemd
  10. JSONObject.fromObject - JSON与对象的转换
  11. HDOJ HDU Today 2112【最短路Dijkstra+字符串处理】
  12. c语言程序小时工资计算,C语言入门之工资计算
  13. 小小屋影视全网搜索在线播放工具
  14. 重组标签云-标签聚类及其评价研究
  15. 笔记存储仓库神器->印象笔记的使用方法
  16. 【前端学习笔记—canvas标签和使用canvas画哆啦A梦案例】
  17. JUnit4 单元测试框架
  18. html恶搞之无限弹窗
  19. 数据结构第二版(朱昌杰版)习题2答案
  20. 外星人装Ubuntu18.04

热门文章

  1. 二级office Excel与PowerPoint篇(重难点分析)
  2. MyEclipse 8.5 中 MTJ 的安装
  3. jzxx1033能被5整除且至少有一位数字是5的所有整数的个数
  4. 数组和list之间的相互转换
  5. Web测试总结 - 测试用例(文本框)
  6. 74161功能表_74161引脚功能表
  7. 「SCOI 2018 D2T1」Pipi 酱的日常
  8. TextView 多行文字末尾添加图片
  9. C# 多输入设备识别 扫码枪键盘区分RAWINPUT原始输入简易开发笔记
  10. 以电子签名形式订立的合同具有证据效力吗?