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

牛客题霸 [ 树的直径] 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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GDOI2021划水记

Day0 上午有意志行&#xff0c;一大早就醒了&#xff0c;然后走了五个小时脚痛。中午洗澡&#xff0c;宿舍轮流看巨人最终话然后聊了一个小时&#xff1f; 下午老师带着我和全爷先开溜&#xff0c;宿舍好像很破旧还还没得充电&#xff0c;领了牌牌和斐爷去吃饭。 然后六点多和…

codeforces1493 D. GCD of an Array(数论)

昨天晚上用的镜像&#xff0c;看的B的图片瞬间不想写了&#xff08;而且这周作业还没碰&#xff09;&#xff0c;不过看到D题突然想做做&#xff0c;于是有了下面的思路&#xff0c;写了一个小时&#xff0c;写完没交看了下榜单发现C题竟然过的人也不多&#xff0c;看了看C题感…

被低估的.net(中) - 广州.net俱乐部2019年纲领

这是被低估的.net系列的中篇。上篇在这里&#xff1a;被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾中篇本来不是这样的&#xff0c;中篇的草稿大纲其实在写上篇之前就写好了&#xff0c;嗯&#xff0c;当时给张队长看过了。然而却因为被.net 粉丝的热情震惊和感动…

P7518-[省选联考2021A/B卷]宝石【主席树,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P7518 题目大意 给出nnn个点的一棵树&#xff0c;每个点上有不大于mmm的数字。 然后给出一个长度为ccc的各个位数不同的序列&#xff0c;每次询问一条路径上找到一个最大的kkk使得该序列的存在1∼k1\sim k1∼k的子序列。 1≤…

牛客题霸 [ 缺失数字] C++题解/答案

牛客题霸 [ 缺失数字] C题解/答案 题目描述 从0,1,2,…,n这n1个数中选择n个数&#xff0c;找出这n个数中缺失的那个数&#xff0c;要求O(n)尽可能小。 题解&#xff1a; 我们可以用map来标记已出现过的数字 因为数组长度给出是len&#xff0c;因为是连续的数字&#xff0c;…

bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)

首先考虑问题的简化版 存在下面两个操作 询问[l,r][l,r][l,r]区间与非的值即alNANDal1NAND…NANDara_l \text{NAND} a_{l1} \text{NAND}\dots \text{NAND} a_ral​NANDal1​NAND…NANDar​单线修改p,xp,xp,x即apxa_pxap​x 这是一道去年校赛题最近才发现区间与非的板子题 首…

[译]RabbitMQ教程C#版 - 远程过程调用(RPC)

先决条件本教程假定 RabbitMQ 已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表 联系我们。在第 教程…

P7514-[省选联考2021A/B卷]卡牌游戏【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7514 题目大意 给出nnn个卡牌有ai/bia_i/b_iai​/bi​&#xff0c;开始都是aia_iai​朝上&#xff0c;将不超过mmm张卡牌变为bib_ibi​面朝上&#xff0c;使得朝上的数字中最大值减去最小值最小。 3≤n≤106,1≤m<n,1≤a…

牛客题霸 [ 旋转数组] C++题解/答案

牛客题霸 [ 旋转数组] C题解/答案 题目描述 一个数组A中存有N&#xff08;N&gt0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0 A1 ………

ML.NET速览

什么是ML.NET&#xff1f;ML.NET是由微软创建&#xff0c;为.NET开发者准备的开源机器学习框架。它是跨平台的&#xff0c;可以在macOS&#xff0c;Linux及Windows上运行。机器学习管道ML.NET通过管道(pipeline)方式组合机器学习过程。整个管道分为以下四个部分&#xff1a;Loa…

P6240 好吃的题目(分治+背包)

P6240 好吃的题目 类似于线段树分治&#xff0c;在每个节点预处理[l,mid],[mid1,r][l,mid],[mid1,r][l,mid],[mid1,r]的背包&#xff0c;然后询问即可 一般代码就类似下面的写法&#xff0c;但是此题有点卡空间于是稍微优化了一下空间。 时间复杂度O{nlog⁡nmax⁡(hi,ti)}O\{…

CF990G-GCD Counting【dfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF990G 题目大意 给出一棵有点权的树&#xff0c;对于每个kkk求有多条路径的点权gcdgcdgcd为kkk 1≤n≤2105,1≤ai≤21051\leq n\leq 2\times 10^5,1\leq a_i\leq 2\times 10^51≤n≤2105,1≤ai​≤2105 解题思路 开始以为要…

牛客题霸 [ 旋转数组的最小数字] C++题解/答案

牛客题霸 [ 旋转数组的最小数字] C题解/答案 题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 NOTE&#xff1a;给出的所有元素都大于0&#xff0c;若数组…

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

写在前面千呼万唤始出来&#xff0c;首先&#xff0c;请允许我长吸一口气&#xff01;真没想到一份来自28岁老程序员的自白 这篇文章会这么火&#xff0c;更没想到的是张善友队长的公众号居然也转载了这篇文章&#xff0c;这就导致两天的时间就有两百多位读者朋友加入了.NET Co…

2018CCF-CSP 5.二次求和(点分治)

5.二次求和 暴力 首先观察询问&#xff0c;树上链u→vu\to vu→v点权加&#xff0c;显然可以用树上差分LOJ dfs序4 O(1)O(1)O(1)完成此操作&#xff0c;然后考虑对这些权值对答案的影响&#xff1f; 设经过某点uuu符合条件的路径条数为pathu\text{path}_upathu​ 当uuu点权ccc…

P4323-[JSOI2016]独特的树叶【换根dp,树哈希】

正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出nnn个点的树和加上一个点之后的树&#xff08;编号打乱&#xff09;。 求多出来的是哪个点&#xff08;如果有多少个就输出编号最小的&#xff09;。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 定义…

牛客题霸 [ 数字在升序数组中出现的次数] C++题解/答案

牛客题霸 [ 数字在升序数组中出现的次数] C题解/答案 题目描述 统计一个数字在升序数组中出现的次数。 题解&#xff1a; 直接for循环&#xff0c;if判断一下&#xff0c;如果是目标的话ant 代码&#xff1a; class Solution { public:int GetNumberOfK(vector<int>…

.Net Core微服务系列--理论篇

微服务的由来微服务最早由Martin Fowler与James Lewis于2014年共同提出来的&#xff0c;但是微服务也不是一个全新的概念&#xff0c;它是由一系列在实践中获得成功并流行起来的概念中总结出来的一种模式&#xff0c;一种概念。而这一系列的概念大体上有这些:领域驱动设计(DDD)…

codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)

这题我tm服了&#xff0c;考试中途肯定添加了一组数据&#xff0c;提交完A了之后&#xff0c;还有20min结束&#xff0c;感觉写不了下一个题了&#xff0c;就下班了&#xff0c;谁知道它有填了一组测试数据把我的乱搞给卡过去了&#xff0c;我又被fst了&#xff1f;&#xff1f…

CF1511G-Chips on a Board【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1511G 题目大意 给出n∗mn*mn∗m的棋盘上每一行有一个棋子&#xff0c;双方轮流操作可以把一个棋子向左移动若干步&#xff08;不能不动&#xff09;&#xff0c;无法操作者输。 qqq次询问只留下期盼的l∼rl\sim rl∼r列时…