牛客题霸 [ 树的直径] C++题解/答案

题目描述

给定一棵树,求出这棵树的直径,即两个节点距离的最大值。

题解:

不知道大家听没听过一个结论:
树的直径可以通过两边dfs找到
步骤:
1.从任意一点进行dfs,然后找到一个最长路径,记录最远点u
2.然后从u再进行dfs,找最长路径,记录一点v。
(u,v)就是树的直径
证明:

我们可以看出图中,树的直径是(4->2->5),长度为9.
我们一开始选定一个点dfs
如果是直径外一点,比如w1,从w1进行dfs找到的就是点4,路径就1->2->4,这个路径一定会与树的直径相交,而找到的4是直径的一端,那从4再进行dfs就是树的直径的另一端5,这样两遍dfs你就找到了树的直径
如果是直径内一点,比如w2,从w2开始dfs找到的最远点4,这个路径会被包含在树的直径里,那找到的点也就是树直径的一端,再dfs就可以找到另一端。
综上用两遍dfs就可以找到树的直径


其实求直径也就是求深度,所以我们dfs直接求树的深度,并记录最大深度,以及对应的节点,然后再带入到第二遍dfs即可

代码:

/*** struct Interval {*  int start;* int end;* };*/class Solution {public:/*** 树的直径* @param n int整型 树的节点个数* @param Tree_edge Interval类vector 树的边* @param Edge_value int整型vector 边的权值* @return int整型*/int far,Max;vector<vector<pair<int,int> >>G;void dfs(int u,int deep,int fa){if(deep>Max){far=u;Max=deep;}for(auto &it:G[u]){int v=it.first;int w=it.second;if(v==fa)continue;dfs(v,deep+w,u);}}int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {// write code hereG.clear(); G.resize(n + 1);for (int i = 0; i < n - 1; ++i) {Interval e = Tree_edge[i];int w = Edge_value[i];int u=e.start;int v=e.end;G[u].push_back(pair<int,int>(v, w));G[v].push_back(pair<int,int>(u, w));}far = 1; Max = 0;dfs(1, 0, 0);dfs(far, 0, far);return Max;}
};

牛客题霸 [ 树的直径] C++题解/答案相关推荐

  1. 牛客题霸 [二叉树的镜像]C++题解/答案

    牛客题霸 [二叉树的镜像]C++题解/答案 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 题解: 根据题也不难看出,二叉树的镜像定义其实就是左右树翻转 所以我们一直递归左子树,到头后递归右子 ...

  2. 牛客题霸 [矩阵元素查找] C++题解/答案

    牛客题霸 [矩阵元素查找] C++题解/答案 题目描述 已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的.设计查找算法返回所查找元素的二元数 ...

  3. 牛客题霸 [栈和排序] C++题解/答案

    牛客题霸 [栈和排序] C++题解/答案 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序 ...

  4. 牛客题霸 [字符串的排列] C++题解/答案

    牛客题霸 [字符串的排列] C++题解/答案 题解: stl真好用,emmm... 代码: class Solution {public:vector<string> Permutatio ...

  5. 牛客题霸 [ 验证IP地址] C++题解/答案

    牛客题霸 [ 验证IP地址] C++题解/答案 题目描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围 ...

  6. 牛客题霸 [表达式求值] C++题解/答案

    牛客题霸 [表达式求值] C++题解/答案 题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 题解: 没有除法emmm 我们从头开始依次判断每个字符 如果是左括号,我们就找右括号,并截取括号内 ...

  7. 牛客题霸 [判断回文] C++题解/答案

    牛客题霸 [判断回文] C++题解/答案 题目描述 给定一个字符串,请编写一个函数判断该字符串是否回文.如果回文请返回true,否则返回false. 题解: 左右两端同时向中间缩 代码: class ...

  8. 牛客题霸 [分糖果问题] C++题解/答案

    牛客题霸 [分糖果问题] C++题解/答案 题目描述 一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下: 每个孩子不管得分多少,起码分到一个糖果. 任意两个相邻的孩子之间,得分较多的孩子必须拿多 ...

  9. 牛客题霸 [合并有序链表] C++题解/答案

    牛客题霸 [合并有序链表] C++题解/答案 题目描述 将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的. 题解: 首先判断l1和l2是否为空 然后依次比较l1和l2的值 ...

最新文章

  1. java写出文本文档乱码_对象流如何写出到文件以及为什么乱码
  2. linux7.3系统u盘制作,制作centos7U盘启动盘
  3. 在NetBeans IDE 6.9.1上搭建Android SDK环境(WIN和Linux平台)
  4. Windows 程序设计技巧
  5. 【Python】Sklearn线性回归模型预测波士顿房价并绘图
  6. ios并发会造成什么问题_痔疮会造成什么伤害?
  7. 【BZOJ4547】【HDU5171】小奇的集合,暴力+矩阵乘法
  8. STM32工作笔记0072---UCOSIII在STM32F103上的移植
  9. VB中窗体模块、标准模块、类模块的区别
  10. 开放大学计算机应用基础第三次,江苏开放大学-计算机应用基础第三次.doc
  11. 关于FAST迅捷FWR310无线路由器桥接移动光猫吉比特网关的问题
  12. 忘记了已保存自动登录的密码,怎么办?
  13. python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
  14. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十四) Be careful!前方怪物出没
  15. 解决MySQL5.7在MAC下登录ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  16. Swift 如何生成随机数
  17. 交友项目【手机号登录注册功能】实现
  18. java约瑟夫环链式结构_顺序表实现解约瑟夫环_Java | 学步园
  19. [黑客讲坛]互联网公司的蛋疼 7
  20. USB Type-C 协议

热门文章

  1. 每日一笑 | 各大互联网公司离职员工群名
  2. 备受期待的Python深度学习来了
  3. java外键实体类_java – 在Embeddable类中的外键映射
  4. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
  5. Android 封装handler,android封装工作线程跟Handler工具类
  6. python pytest allure_python测试框架pytest和测试报告allure的联合使用-----测试套件
  7. win10+tomcat+php+配置环境变量配置,Win10系统Tomcat环境变量配置方法
  8. 怎么打包图片_超简单的免费批量图片压缩技巧,只需3步
  9. php字符串赋值给变量,JavaScript-如何将一个PHP字符串安全赋值给Javascript变量(包含引号和换行符的)...
  10. android websocket封装,Android WebSocket 方案选型OkHttp