算法提高课-动态规划-树形DP-AcWing 1072. 树的最长路径:dfs写法
题目分析
来源:acwing
分析:
树的最长直径:距离最远的两个点之间的距离,这里是带边权的情况。
在没有边权(或者边权都是1)的时候,树的直径也是最远两个点的距离。
样例对应的树如下,树的直径= 22,对应的最长链是下面橘黄色的那条路径。
经典做法:
- 任取1点作为起点,找到距离该点最远的点u。
- 再找到距离u最远的点v。
这里把路径分类,要找出路径中最高的点。经过一个点A的所有路径中,最高点是A点的路径归类到A点门下。
这样我们就可以枚举所有点,找到挂到该点上的路径的最大值即可。
接下来的问题是:如何求挂到该点上所有路径中的最大值(最长路径)呢?
这个问题的思路是:对于结点A上的所有路径,我们找到A点的所有直接儿子,分别求它们从上往下的最大距离(到叶子结点)。我们只需要其中的最大值和次大值,记为d1和d2,则,A点的路径长度最大值就是 d1 + d2,因为它们直接构成以A为最高点的最长路径的长度。以下图为例,1作为最高点,构成的最长路径一定是从它的3个儿子中任意选择两个构成的。
ac代码
dfs写法
#include<bits/stdc++.h>
using namespace std;
const int N = 10010, M = N * 2;
int n;
int h[N], e[M], ne[M], w[M], idx;
int ans; // 树的直径存在ans中void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}// 以u点为最高点,返回从该点往下走的路径的最大长度
// father防止反向遍历,即从低到高,进入循环
int dfs(int u, int father){int dist = 0; // 从u点开始往下走的最大长度int d1 = 0, d2 = 0; //最长距离和次长距离// 遍历所有儿子结点for(int i = h[u]; ~i; i = ne[i]){int j = e[i];// 由于是无向边,这里防止反向搜索if(j == father) continue;int d = dfs(j,u) + w[i];dist = max(dist, d);// 如果d大于最大值d1,则最大值d1变成次大值if( d >= d1) d2 = d1, d1 = d;// 否则d如果大于次大值,则d就是次大值else if(d > d2) d2 = d;}ans = max(ans, d1 + d2);return dist;
}int main(){cin >> n;memset(h, -1, sizeof h);for(int i = 0; i < n -1; i ++){int a, b, c;cin >> a >> b >> c;add(a, b, c), add(b, a ,c);}dfs(1, -1); // 任取结点作为根结点,这里选择1号点cout << ans << endl;}
题目来源
https://www.acwing.com/problem/content/1074/
算法提高课-动态规划-树形DP-AcWing 1072. 树的最长路径:dfs写法相关推荐
- Acwing 1072. 树的最长路径
Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子, ...
- 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}ΣgiΣfi的最大值,这种问题称为01分数规 ...
- 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 如何建图? 这样建图.以样例举例.起点是前两个字母,终点是末尾两个字母,边权是字符串的长度. 我们求的是什么呢? 题目要求Σ边权Σ1 ...
- 算法提高课-图论-负环-AcWing 904. 虫洞:spfa求负环裸题
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 负环:负环是这样的一个环,该环上的边权之和是负数. 存在负环的话,会对我们求最短路造成障碍,因为绕着这个负环转无数次,最短路越来越小 ...
- 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1,...,Xn ...
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- AcWing算法提高课
1. 动态规划(43/68) 1.1 数字三角形模型(4/4) 1.1.1 AcWing 1015. 摘花生 结论: f[i][j]=max(f[i−1][j],f[i][j−1])+w[i][j] ...
- AcWing算法提高课笔记
目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...
- 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...
最新文章
- 【Java】Linux下安装配置Oracle JDK 1.7版本
- 机器人视觉的九大挑战
- Android Studio编译NDK工程时,报ndk-build.cmd'' finished with non-zero exit value 2错误
- 转载:GCC 提供的原子操作
- 车机没有carlife可以自己下载吗_长安CS55自带百度CarLife使用方法
- axure 8 表格合并_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
- 好用的linux连接工具
- 丰收互联蓝牙key怎么开机_蓝牙UKEY使用说明
- 新机Switch OLED真机实测分享
- 何夕 - 六道众生·何夕科幻自选集(2014年1月31日)
- 百度地图获取河流_开车旅行少不了地图导航,高德地图和百度地图,你觉得哪个好用?...
- python xlsx转xls_Python 批量将xls文件转换为xlsx
- 未来感html5模板,未来感的家
- 2023年东南大学英语笔译考研上岸前辈备考经验指导
- 微信公众平台教程--素材编辑
- js+css制作导航栏下划线跟随动画,App+H5点击效果
- 如何修复SSL: CERTIFICATE_VERIFY_FAILED
- 帝国理工学院Stefan Vlask教授招收机器学习方向全奖博士生
- mysql odbc怎么卸载_如何完全卸载数据库
- 互联网与达尔文进化论的结合
热门文章
- 结对开发团队成员以及题目介绍
- JavaScript要点 (二) 使用误区
- poj 3207 Ikki's Story IV - Panda's Trick(2-SAT)
- alter table add column多个字段_SQL对表中字段的操作 alter
- 电子到底为什么会干涉?
- 【Matlab 控制】构建系统,绘制零极点
- ubuntu常用小工具
- 【任务脚本】0523更新京东618叠蛋糕任务脚本全自动脚本,大神更新了京东任务全自动程序...
- 【工具】24K纯吊丝超低成本低功耗电流测试方案,esp32实测功耗
- 采用IpIq控制方法和电流空间和电压空间的PWM方法控制