求树的直径(史上最详细,匠心之作,限时免费看)

news2024/9/26 3:24:03

一,题目

SPOJ PT07Z, Longest path in a tree


一.定义

树上任意两节点之间最长的简单路径即为树的「直径」。

二,解法

做法 1. 两次 DFS

过程:

首先从任意节点y, 开始进行第一次 DFS,到达距离其最远的节点,记为 z,然后再从 z开始做第二次 DFS,到达距离z 最远的节点,记为z' ,则 f(z,z')即为树的直径

显然,如果第一次 DFS 到达的节点 z直径的一端,那么第二次 DFS 到达的节点z' 一定是直径的另外一端。我们只需证明在任意情况下,z必为直径的一端

定理:

在一棵树上,从任意节点 y开始进行一次 DFS,到达的距离其最远的节点z 必为直径的一端。

证明:

注意事项:

1.

上述证明过程建立在所有路径均不为负的前提下。如果树上存在负权边,则上述证明不成立

所以:

故若存在 负权边,则无法使用 两次 DFS 的方式求解 直径

2.

如果需要求出一条直径上所有的节点,则可以在第二次 DFS 的过程中,记录每个点的前序节点,即可从直径的一端一路向前,遍历直径所有节点

代码实现:

做法 2.树形 DP

过程:

我们记录当 1的根时,每个节点作为子树的根向下,所能延伸的最远距离d1 ,和次远距离d2 ,那么直径就是所有 d1+d2的最大值

树形 DP 可以在存在负权边的情况下求解出树的直径。

性质:

若树上所有边边权均为正,则树的所有直径中点重合

注意事项:

如果需要求出一条直径上所有的节点,则可以在 DP 的过程中,记录下每个节点能向下延伸的最远距离次远距离所对应的子节点,之后再找到对应的u ,使得

,即可分别沿着从u 开始的最远距离和次远距离对应的子节点一路向下,遍历直径上所有的节点。

证明:

代码实现:

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

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

相关文章

ARM S5PV210 中断体系与外部中断实战

一、中断体系介绍 1、什么是中断 中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,多件事情都完成了。微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并…

OQC与Cyxtera将量子计算应用于数据中心

牛津量子电路(OQC)正与云服务公司Cyxtera合作,在数据中心安装量子计算机,方便用户在其本地数据集上运行量子算法。 在葡萄牙里本举行的网络峰会上,牛津量子电路(OQC)首席执行官ILana Wisby谈到了…

【力扣经典题目】环形链表,判断链表是否有环

题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链…

【Unity】新手初学Animation实现人物移动

【Unity】新手初学Animation实现人物移动 需求:开发影院系统,希望加入Avatar人物,在其中行走和坐下 环境:Unity2021.3 新手初学Animation教程:BV1BW41187fL Avatar人物模型资源:学长网盘链接分享 Animation…

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

实习------SpringMVC 框架学习

Spring MVC 是什么 (了解)Spring MVC(全称 Spring Web MVC)是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架,是 Spring 为表示层(UI)开发提供的一整套完备的解决方案。注&#xff…

《Linux运维总结:使用旧版redis-shake2.x进行redis集群间的数据同步【方案二】》

一、redis-shake简介 redis-shake是阿里云开源的用于Redis数据迁移和过滤的工具。 Github参考:redis-shake简介 1.1、迁移工具对比 redis-migrate-tool redis-migrate-tool是唯品会开源的一款Redis异构集群之间的数据实时迁移工具,不过已经有两年没有更…

如何对【javaSE】语法阶段复习

下面是我对学习java阶段的总复习,我愿称之为【复习宝典】 如果你对java的部分语法阶段的知识有所困惑,进来看看吧! 文章目录 目录 文章目录 一、初始java 1.1java 的由来 1.2JDK安装 1.3main方法的介绍 二、数据类型和变量 2.1数据类型 三、运…

xxljob 里面 InheritableThreadLocal详解,XxlJobContext类的详解

目录 1 需求2 XxlJobContext类3 InheritableThreadLocal 类可以做什么1 需求 在xxljob 里面,有一个地方使用到了InheritableThreadLocal类 我们先说XxlJobContext类是干什么的,里面有什么东西 2 XxlJobContext类 这个类就是一个实体类,可以理解为实体类,里面有属性,有g…

Spring Boot读取配置文件内容的三种方式

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、Value 二、Environment 2.1 注入对象 2.2 调用获取属性的方法 2.3 上述两种方法对比 三、ConfigurationProperties 3.1 创建一个实…

前端工程师leetcode算法面试必备-简单的二叉树

一、前言 本难度的题目主要考察二叉树的基本概念和操作。 1、基本概念 树是计算机科学中经常用到的一种非线性数据结构,以分层的形式存储数据。二叉树是一种特殊的树结构,每个节点最多有两个子树,通常子树被称作“左子树”和“右子树”。 …

在结构异质的云杉林中使用机载激光扫描仪数据进行单树分割

论文题目:Single Tree Segmentation Using Airborne Laser Scanner Data in a Structurally Heterogeneous Spruce Forest Abstract 在这项研究中,我们提出了一种基于机载激光扫描的树冠表面模型 (CSM) 及其相应点云的单树分割和表征的新方法。该方法包…

AI算法工程师 | 09机器学习-概率图模型(一)概率图模型概述

目录机器学习 - 概率图模型 之 概率图模型概述1、概率图模型学习的意义2、有向图和无向图3、生成式模型与判别式模型机器学习 - 概率图模型 之 概率图模型概述 本阶段将开启 概率图模型系列 的旅程。 1、概率图模型学习的意义 从自然语言处理 NLP 的角度看: 在自…

前端性能优化(四):资源优化

目录 一:资源的压缩与合并 1.1.为什么要压缩&合并 1.2.HTML压缩: 1.3.CSS压缩: 1.4.JS 压缩与混淆: 1.5.CSS JS 文件合并: 二:图片格式优化 2.1.JPEG/JPG: 2.2.PNG: 2…

linux之终端里sqlite数据库的使用

一. linux下安装数据库和创建一个数据库 1.安装命令: (1)sudo apt-get install sqlite (2) sudo apt-get install libsqlite3-dev 2.安装完后,创建一个数据库,终端下输入命令 【sqlite3 数据库名字 】数据库名字以.db 结尾格式 创建数据库student.db 【 …

node.js--vm沙箱逃逸初探

前言 前几天遇到一个考察vm沙箱逃逸的题目,由于这个点是第一次听说,所以就花时间了解了解什么是沙箱逃逸。此篇文章是对于自己初学vm沙箱逃逸的学习记录,若记录知识有误,欢迎师傅们指正。 什么是沙箱 就只针对于node.js而言&am…

有关于huggingface tokenizer的text_pair

tokenizer有一个名为text pair的参数,这个参数在做NLI任务的时候很有用,因为输入不是一个single sentence,而是sentence pair。 但是这个参数的类型让人非常confused,而且同时还有一个text参数,让人不知道传入的sente…

Java-集合(2)

List集合 List接口是Collection接口的子接口 List集合类的元素是有序的(添加顺序和取出顺序是一致的)且可重复List集合类的每个元素都有对应的索引(和数组索引是一样的) List集合的常用方法 add(int index Object ele):在index索引位置插…

软件供应链安全中:攻击面远超想象

| 软件供应链攻击3年飙升742% | 引人注目的软件供应链攻击正在上升。欧盟网络安全机构ENISA报告称,自2020年初以来,有组织的软件供应链攻击数量增加了4倍。Gartner认为,这一趋势将持续下去。在《软件工程领导者如何降低软件供应链安全风险》…

dubbo学习笔记1(小d课堂)

常见的dubbo项目分层: 搭建springbootdubbo环境 我们首先用idea创建一个maven项目: 我们把src删除,在里面创建module: 然后接下来我们就要去用springboot去整合dubbo。 我们可以去github上去搜索dubbo,会找到dubbo-s…