题目描述

原题链接: https://www.acwing.com/problem/content/1074/

思路

以下针对树的边权都一样的情况。

推荐使用BFS, 比赛的时候栈空间只有1MB,DFS太深可能会爆战。

使用反证法证明:

u是距离a最远的点,bc是树的直径。有两种情况:

  1. au和bc有交点。有交点x的话,由于u是距离a最远的点,则xu>xc, 即bu>bc。但是,由于bc是树的直径,bc是最长的,bc应该大于bu。矛盾。
  2. au和bc没交点。由于这是树,所以两条直线一定是联通的。假设从x连到y。由于u是距离a最远的点,所以①>②+③。 但是由于bc是直径,是最长的。by+②+①明显大于bc。这与bc是直径矛盾。

综上,德政。

下边是求带权的树的最长路径。

代码

// 铅笔大佬的题解:https://www.acwing.com/solution/content/63883/// 任选树的一个节点,作为根节点
// 然后确定拓扑序
// 通过递归求子树中的最大值和次大值。维护根节点的最大值和次大值。
// 结果就是最大值加次大值。#include<iostream>
#include<cstring>using namespace std;const int N = 10010,  M = N << 1;// 无向图int n;
int h[N], e[M], w[M], ne[M], idx;
// f1[i] 表示距离i节点的最长路径
// f2[i] 表示距离i节点的次长路径
int f1[N], f2[N], res;void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void dfs(int u, int father)
{f1[u] = f2[u] = 0;for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];// 不能往父节点搜,遇到了父节点要直接跳过。if(j == father) continue;dfs(j, u);// u变成了父节点// 更新f1[u] 和 f2[u]// 注意这个=号,大于等于都要更新,等于的话会影响f2[u]if(f1[j] + w[i] >= f1[u]) f2[u] = f1[u], f1[u] = f1[j] + w[i];else if(f1[j] + w[i] > f2[u]) f2[u] = f1[j] + w[i];}res = max(res, f1[u] + f2[u]);
}int main()
{memset(h, -1, sizeof h);cin >> n;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 << res << endl;return 0;
}

复杂度分析

时间复杂度:
每个点只会被搜到一次,O(n)。

Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索相关推荐

  1. UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)

    Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...

  2. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  3. AcWing1072. 树的最长路径(树形DP)题解

    题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 现在请你找到树中的一条最长路径. 换句话说,要找到一条路径,使得使得路径两端的点的距离最 ...

  4. 201503-4 网络延时 (本质是求树的最长路径)

    树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...

  5. Acwing 1072. 树的最长路径

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

  6. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法

    问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...

  7. 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树

    2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...

  8. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  9. PAT甲级1106 Lowest Price in Supply Chain:[C++题解]树、结点到根结点的距离、树形dp、记忆化搜索

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:这道题是第三次做了. 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的 ...

最新文章

  1. Python爬虫之reuqests实现简单网页采集--网页采集教程
  2. Java多线程——多线程的基本概念和使用
  3. qt android meta data,Qt小技巧5.解决Failed to extract plugin meta data问题
  4. Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】
  5. 《Adobe Illustrator CS5中文版经典教程》—第0课0.5节使用绘图模式
  6. 【计蒜客 - 蓝桥训练】轻重搭配(贪心,STLset 或 二分)
  7. rabbitmq AmqpClient 使用Fanout 交换机投递与接收消息,C++代码示例
  8. 移动webAPP前端开发技巧汇总
  9. 分部类和方法的学习以及在LINQ中的应用(原创)
  10. android 9.0 开机动画,Android bootanim开机动画启动流程
  11. tsp问题——遗传算法解决
  12. 如何实现AI视频车型识别算法
  13. 2021最新Spring Security知识梳理
  14. 工业互联网的数据集成
  15. ADS 修改绘图单位
  16. 购物车二级列表联动以及价格计算
  17. Android逆向之旅---应用的反调试方案解析(附加修改IDA调试端口和修改内核信息)
  18. 功能安全-26262-理论到实践-基础知识-标准机构与认可、认证
  19. 12-属性动画源码分析
  20. java发送post请求上传文件和json数据

热门文章

  1. 作为一名程序员,你觉得最重要的能力是什么?
  2. 江阴长泾/江阴各乡镇到无锡汽车客运站/无锡东站/硕放机场站快捷班车的购票方法
  3. 推荐系统之DIN模型(注意力机制对业务的理解)
  4. 如何写好一个产品需求文档PRD
  5. 为什么要阅读——兼分享《首先,打破一切常规》[中译文]:世界顶级管理者的成功秘诀/(美)马库斯·白金汉,(美)柯特·科夫曼 著
  6. html5 plus 支付,h5+ app 第三方支付调用步骤
  7. 记录一下大三找实习的过程
  8. 泛微OA E9后端环境搭建(IDEA) Ecology 9二次开发环境搭建 ecology二次开发
  9. 微信小程序项目实战:电影购票系统-李宁-专题视频课程
  10. Using Memory Efficiently(Pro Android Apps Performance Optimization)