【树上算法】树的直径
树的直径
一、什么是树的直径
直径往往和圆有关系。数学中,圆的直径是圆内最长的一条线段。那么在树中,树的直径就是树中最长的一段距离。
二、计算树的直径的思路
命题:
①在树上任取一个点x,找到距离x最远的一个点,即为y。y就是直径的一段。
②再找到距离y最远的一个点,即为z。这时候,y->z的路径就是树的直径了。
证明命题:(分①②两步证)
①:任取一点,距离这个点最远的点就是直径的一段。
分两种情况。
情况一:x点位于直径上。
在直径上的话图大概是长这样的。
直径的一段(y)
若干节点
选取的点(x)
若干节点
直径的另一段(z)
x → y x→y x→y和 x → z x→z x→z中必然有一个是较长的,y或z中的一个也肯定是距离x最远的点。
你可能会担心:要是有另外一个点w是距离x最远的点呢?
其实这个担心是多余的。
按刚才所想的那样,现在有三条路通向x节点,分别是:x->y(长度为a),x->z(长度为b),x->w(长度为c)。
我们要选择其中最长两条相连接作为直径。
若c>a或c>b,那么最长的两条就是(c,a)或者(c,b)了,而不是命题中所提到的 ( y → x → z ) (y→x→z) (y→x→z)这条路。
情况二:x点位于直径外。
其实这个证明方法与情况一相似,只需要注意一点:将x->y或x->z转化为另一条路径(先到直径上的一点再到直径的端点)即可。
②:知道了直径的一段,选最远的一个点,相连即为直径。
这个就不用证明了吧,就是定义啊。
三、计算树的直径的代码
这里就需要一个重要的函数——用于计算距离最远的点。
可以用 d f s dfs dfs实现。因为这道题的特殊性,所以树要用无向图存储。所以还要加一个参数 l a s t last last,表示上一次遍历的点,下一次就不能访问了,否则会导致死循环。
代码:
int point, mx = -1;
void dfs(int u, int last, int dis){if(dis > mx){mx = dis;point = u;}for(int i = 0; i < G[u].size(); i++){int v = G[u][i].first;int w = G[u][i].second;if(v == last)continue;dfs(v, u, dis + w);}
}
调用时很简单:
dfs(1, -1, 0);
mx = -1;//这是一个易错点,要记得初始化。
dfs(point, -1, 0);
cout << mx << endl;
【树上算法】树的直径相关推荐
- 牛客 - 树上子链(树的直径-处理负权)
题目链接:点击查看 题目大意:给出一棵树,每个点都有权值,现在要求输出树上权值和最大的一条链 题目分析:读完题后第一反应是树的直径,赶紧去找来模板贴上,交上去WA了一发后意识到,正常树的直径只能处理非 ...
- 基础算法 - 树的直径
题目地址:https://leetcode-cn.com/problems/tree-diameter/ 1245. 树的直径 难度中等48收藏分享切换为英文接收动态反馈 给你这棵「无向树」,请你测算 ...
- 算法提高——树上DP(树的直径)
文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...
- 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)
整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...
- 求树的直径算法以及证明
以下为两次dfs(bfs)的做法以及正确性证明. 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值: (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值: (3)再 ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
- 树上子链(树形dp求树的直径)
树上子链 题意: 给定一棵树 T ,树 T 上每个点都有一个权值. 定义一颗树的子链的大小为:这个子链上所有结点的权值和 . 请在树 T 中找出一条最大的子链并输出. 题解: 求树的直径,题目中存在负 ...
- 《鲁滨逊漂流记》题解(LCA算法求树的直径)
Description <鲁滨逊漂流记>只讲到了鲁滨逊在岛上建立起一个自给自足的生态环境.而大家不知道的是,在此之后,鲁滨逊因为太无聊,开始探索周边的岛屿,一共 NNN 天.鲁滨逊第 11 ...
- 树的直径算法(dfs)
1.什么是树的直径? 树的直径是一颗树中任意两点最长的距离 2.如何求树的直径? (1).任意找一点x,并求得树上任意一点到x的距离存到数组dist中 (2).找到距离x最长的点y并以点y为起点找到树 ...
最新文章
- openlayers2中selectcontrol用法
- 安装visual studio 2013--【转】
- 【CF#192 A】Funky Numbers (二分,查找,二元组)
- 7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)
- 【LeetCode笔记】200. 岛屿数量(Java、DFS)
- 带你自学Python系列(十):用户输入input函数详解
- Java 面向对象和封装
- 市场推广的及时性要素
- 英语文献阅读过程中的词汇积累
- 最全SysML 教程
- 食品科学与工程考研可以考计算机吗,食品科学与工程女汉子,对于考研比较迷茫,有几个问题麻烦各位前辈指点迷津,谢谢 。 - 考研 - 小木虫 - 学术 科研 互动社区...
- VS2008鼠标右键不灵敏,TFS的Local Path无法打开对应文件夹
- 微信小游戏SDK,全方位解读
- Android事件分发原理
- 安装APK 免输入vivo、oppo密码
- hbase数据库_实验目的
- js实现身份证号码验证
- windows 10企业版windows Defender无法使用
- 7、MyBatis分页
- 计算机网络统考在线试题打不开,电脑上通用考试客户端打不开怎么办