题目分析

来源:acwing

分析:

树的最长直径:距离最远的两个点之间的距离,这里是带边权的情况。

在没有边权(或者边权都是1)的时候,树的直径也是最远两个点的距离。

样例对应的树如下,树的直径= 22,对应的最长链是下面橘黄色的那条路径。

经典做法:

  1. 任取1点作为起点,找到距离该点最远的点u。
  2. 再找到距离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写法相关推荐

  1. Acwing 1072. 树的最长路径

    Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子, ...

  2. 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}Σgi​Σfi​​的最大值,这种问题称为01分数规 ...

  3. 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 如何建图? 这样建图.以样例举例.起点是前两个字母,终点是末尾两个字母,边权是字符串的长度. 我们求的是什么呢? 题目要求Σ边权Σ1 ...

  4. 算法提高课-图论-负环-AcWing 904. 虫洞:spfa求负环裸题

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 负环:负环是这样的一个环,该环上的边权之和是负数. 存在负环的话,会对我们求最短路造成障碍,因为绕着这个负环转无数次,最短路越来越小 ...

  5. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  6. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  7. 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] ...

  8. AcWing算法提高课笔记

    目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...

  9. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

最新文章

  1. 【Java】Linux下安装配置Oracle JDK 1.7版本
  2. 机器人视觉的九大挑战
  3. Android Studio编译NDK工程时,报ndk-build.cmd'' finished with non-zero exit value 2错误
  4. 转载:GCC 提供的原子操作
  5. 车机没有carlife可以自己下载吗_长安CS55自带百度CarLife使用方法
  6. axure 8 表格合并_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
  7. 好用的linux连接工具
  8. 丰收互联蓝牙key怎么开机_蓝牙UKEY使用说明
  9. 新机Switch OLED真机实测分享
  10. 何夕 - 六道众生·何夕科幻自选集(2014年1月31日)
  11. 百度地图获取河流_开车旅行少不了地图导航,高德地图和百度地图,你觉得哪个好用?...
  12. python xlsx转xls_Python 批量将xls文件转换为xlsx
  13. 未来感html5模板,未来感的家
  14. 2023年东南大学英语笔译考研上岸前辈备考经验指导
  15. 微信公众平台教程--素材编辑
  16. js+css制作导航栏下划线跟随动画,App+H5点击效果
  17. 如何修复SSL: CERTIFICATE_VERIFY_FAILED
  18. 帝国理工学院Stefan Vlask教授招收机器学习方向全奖博士生
  19. mysql odbc怎么卸载_如何完全卸载数据库
  20. 互联网与达尔文进化论的结合

热门文章

  1. 结对开发团队成员以及题目介绍
  2. JavaScript要点 (二) 使用误区
  3. poj 3207 Ikki's Story IV - Panda's Trick(2-SAT)
  4. alter table add column多个字段_SQL对表中字段的操作 alter
  5. 电子到底为什么会干涉?
  6. 【Matlab 控制】构建系统,绘制零极点
  7. ubuntu常用小工具
  8. 【任务脚本】0523更新京东618叠蛋糕任务脚本全自动脚本,大神更新了京东任务全自动程序...
  9. 【工具】24K纯吊丝超低成本低功耗电流测试方案,esp32实测功耗
  10. 采用IpIq控制方法和电流空间和电压空间的PWM方法控制