树的直径

一、什么是树的直径

直径往往和圆有关系。数学中,圆的直径是圆内最长的一条线段。那么在树中,树的直径就是树中最长的一段距离。

二、计算树的直径的思路

命题:
①在树上任取一个点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;

【树上算法】树的直径相关推荐

  1. 牛客 - 树上子链(树的直径-处理负权)

    题目链接:点击查看 题目大意:给出一棵树,每个点都有权值,现在要求输出树上权值和最大的一条链 题目分析:读完题后第一反应是树的直径,赶紧去找来模板贴上,交上去WA了一发后意识到,正常树的直径只能处理非 ...

  2. 基础算法 - 树的直径

    题目地址:https://leetcode-cn.com/problems/tree-diameter/ 1245. 树的直径 难度中等48收藏分享切换为英文接收动态反馈 给你这棵「无向树」,请你测算 ...

  3. 算法提高——树上DP(树的直径)

    文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...

  4. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  5. 求树的直径算法以及证明

    以下为两次dfs(bfs)的做法以及正确性证明. 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值: (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值: (3)再 ...

  6. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  7. 树上子链(树形dp求树的直径)

    树上子链 题意: 给定一棵树 T ,树 T 上每个点都有一个权值. 定义一颗树的子链的大小为:这个子链上所有结点的权值和 . 请在树 T 中找出一条最大的子链并输出. 题解: 求树的直径,题目中存在负 ...

  8. 《鲁滨逊漂流记》题解(LCA算法求树的直径)

    Description <鲁滨逊漂流记>只讲到了鲁滨逊在岛上建立起一个自给自足的生态环境.而大家不知道的是,在此之后,鲁滨逊因为太无聊,开始探索周边的岛屿,一共 NNN 天.鲁滨逊第 11 ...

  9. 树的直径算法(dfs)

    1.什么是树的直径? 树的直径是一颗树中任意两点最长的距离 2.如何求树的直径? (1).任意找一点x,并求得树上任意一点到x的距离存到数组dist中 (2).找到距离x最长的点y并以点y为起点找到树 ...

最新文章

  1. openlayers2中selectcontrol用法
  2. 安装visual studio 2013--【转】
  3. 【CF#192 A】Funky Numbers (二分,查找,二元组)
  4. 7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)
  5. 【LeetCode笔记】200. 岛屿数量(Java、DFS)
  6. 带你自学Python系列(十):用户输入input函数详解
  7. Java 面向对象和封装
  8. 市场推广的及时性要素
  9. 英语文献阅读过程中的词汇积累
  10. 最全SysML 教程
  11. 食品科学与工程考研可以考计算机吗,食品科学与工程女汉子,对于考研比较迷茫,有几个问题麻烦各位前辈指点迷津,谢谢 。 - 考研 - 小木虫 - 学术 科研 互动社区...
  12. VS2008鼠标右键不灵敏,TFS的Local Path无法打开对应文件夹
  13. 微信小游戏SDK,全方位解读
  14. Android事件分发原理
  15. 安装APK 免输入vivo、oppo密码
  16. hbase数据库_实验目的
  17. js实现身份证号码验证
  18. windows 10企业版windows Defender无法使用
  19. 7、MyBatis分页
  20. 计算机网络统考在线试题打不开,电脑上通用考试客户端打不开怎么办

热门文章

  1. 区块链未来的发展前景是什么?
  2. amd、cmd、esmodule、commonjs区别
  3. 北邮数据库实验7mysql_北邮大三下第7次数据库实验报告--mysql
  4. 第三代CAN技术即将到来
  5. Linux - gzip使用
  6. jQuery(二十二)
  7. 第二十九篇:故障处理流程
  8. 冒泡排序【Java】
  9. android 实例 super 什么意思
  10. 96张完整PPT清晰解读全球智能制造趋势!