Acwing1072 树的最长路径(树的直径)树形Dp 记忆化搜索
题目描述
原题链接: https://www.acwing.com/problem/content/1074/
思路
以下针对树的边权都一样的情况。
推荐使用BFS, 比赛的时候栈空间只有1MB,DFS太深可能会爆战。
使用反证法证明:
u是距离a最远的点,bc是树的直径。有两种情况:
- au和bc有交点。有交点x的话,由于u是距离a最远的点,则xu>xc, 即bu>bc。但是,由于bc是树的直径,bc是最长的,bc应该大于bu。矛盾。
- 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 记忆化搜索相关推荐
- 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 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- AcWing1072. 树的最长路径(树形DP)题解
题目传送门 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值. 现在请你找到树中的一条最长路径. 换句话说,要找到一条路径,使得使得路径两端的点的距离最 ...
- 201503-4 网络延时 (本质是求树的最长路径)
树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...
- Acwing 1072. 树的最长路径
Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子, ...
- 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...
- 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树
2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...
- PAT甲级1106 Lowest Price in Supply Chain:[C++题解]树、结点到根结点的距离、树形dp、记忆化搜索
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:这道题是第三次做了. 和PAT甲级1079 Total Sales of Supply Chain:[C++题解] 树.结点到根结点的 ...
最新文章
- Python爬虫之reuqests实现简单网页采集--网页采集教程
- Java多线程——多线程的基本概念和使用
- qt android meta data,Qt小技巧5.解决Failed to extract plugin meta data问题
- Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】
- 《Adobe Illustrator CS5中文版经典教程》—第0课0.5节使用绘图模式
- 【计蒜客 - 蓝桥训练】轻重搭配(贪心,STLset 或 二分)
- rabbitmq AmqpClient 使用Fanout 交换机投递与接收消息,C++代码示例
- 移动webAPP前端开发技巧汇总
- 分部类和方法的学习以及在LINQ中的应用(原创)
- android 9.0 开机动画,Android bootanim开机动画启动流程
- tsp问题——遗传算法解决
- 如何实现AI视频车型识别算法
- 2021最新Spring Security知识梳理
- 工业互联网的数据集成
- ADS 修改绘图单位
- 购物车二级列表联动以及价格计算
- Android逆向之旅---应用的反调试方案解析(附加修改IDA调试端口和修改内核信息)
- 功能安全-26262-理论到实践-基础知识-标准机构与认可、认证
- 12-属性动画源码分析
- java发送post请求上传文件和json数据
热门文章
- 作为一名程序员,你觉得最重要的能力是什么?
- 江阴长泾/江阴各乡镇到无锡汽车客运站/无锡东站/硕放机场站快捷班车的购票方法
- 推荐系统之DIN模型(注意力机制对业务的理解)
- 如何写好一个产品需求文档PRD
- 为什么要阅读——兼分享《首先,打破一切常规》[中译文]:世界顶级管理者的成功秘诀/(美)马库斯·白金汉,(美)柯特·科夫曼 著
- html5 plus 支付,h5+ app 第三方支付调用步骤
- 记录一下大三找实习的过程
- 泛微OA E9后端环境搭建(IDEA) Ecology 9二次开发环境搭建 ecology二次开发
- 微信小程序项目实战:电影购票系统-李宁-专题视频课程
- Using Memory Efficiently(Pro Android Apps Performance Optimization)