树的直径解释

定义

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

性质

  1. 树的直径不一定唯一。

    举个例子,比如说有这么一棵树:

    假设这张图中每一条边边权均为 1 1 1,那么手动推算一下,发现直径有:2 -> 1 -> 4 -> 53 -> 1 -> 4 -> 6(自己手动去推,这里就不一一例举了)……


  1. 树的直径的端点一定是深度为 1 1 1 的点。

    对于这种图论的知识点还是先画张图(边权都是 1 1 1):

    在这里插入图片描述

    现在我们找的点对是 ( 2 , 4 ) (2,4) (2,4),假设 ( 2 , 4 ) (2,4) (2,4) 是这棵树的直径。

    但是, 2 2 2 / 4 4 4 除了两个点向连接的那条边之外, 2 2 2 还连接了 1 1 1 / 3 3 3 4 4 4 连接了 5 5 5 / 6 6 6。显然还能继续拓展,可以证明, ( 2 , 4 ) (2,4) (2,4) 一定不是树的直径。


  1. 树的直径若有多条,那么所有的树的直径一定交汇于 1 1 1 个或 2 2 2 个点。这 1 1 1 个或 2 2 2 个点即为「树的中心」。

    我们采用反证法进行证明:

    假设两条直径 ( A , B ) (A,B) (A,B) ( C , D ) (C,D) (C,D) 互不相交,因为树是联通的,所以一定存在一条路径连接这两条直径上的点。我们设 ( A , B ) (A,B) (A,B) 上某一个点为 x x x ( C , D ) (C,D) (C,D) 上某一个点为 y y y

    现在,我们从 A A A 出发,依次经过 x x x y y y 到达 D D D。显然,新路径比 ( A , B ) (A,B) (A,B) 要长,与 ( A , B ) (A,B) (A,B) 为直径互相矛盾,所以假设不成立。

    不过,需要注意上面假设成立的条件是:不存在 3 3 3 个以上的连续的边权为 0 0 0 的路径。

    比如说下面这张图:

    假设我们选择路径 ( 1 , 2 ) (1,2) (1,2) ( 5 , 4 ) (5,4) (5,4),这两条路径没有相交且均为「树的直径」,这种情况下,假设失效。


  1. 树上任意点 i i i,距离其最远的点 x x x,一定是树的直径的某个端点

    同样采用反证法,假设 x x x 不是直径的某个端点,那么存在一条从 i i i 开始的路径,比从 i i i x x x 要更长。

    矛盾点就在于,如果 x x x 不为直径的某个端点,那么 i i i x x x 的路径不可能是最长的路径。但是根据 x x x 的定义, x x x 是距离 i i i 最远的点。意味着 i i i x x x 的路径是树的最长路径之一,显然假设不成立。

    所以, x x x 一定是树的直径的某个端点。

解法

解法1:Floyd

先运行一遍 Floyd,然后找出最长路径的长度。

时间复杂度 O ( n 3 ) O(n^3) O(n3),效率低下。

解法2:两遍 DFS

第一遍,我们从任意一点开始跑 DFS。为了方便,我们通常选择从 1 1 1 节点开始跑。

求出距离其最远的点 x x x

然后,从 x x x 开始跑第二遍 DFS。找出距离其最远的点 y y y,顺带求出直径的长度。

时间复杂度 O ( n ) O(n) O(n),比较优秀。

解法3:树形 DP

在上面 DFS 的解法中,你可能会发现一个问题:解法 2 2 2 跑不了负边权

Hack

Input:

9
1 2 -3
1 3 1
2 4 -7
4 5 4
4 6 -2
6 7 -3
7 8 -9
7 9 3

Output:

5

我们需要找出一条最长链和一条次长链,且最长链和次长链互不相交。

求出从任意节点出发,最长链的长度和次长链的长度。

用树形 DP 来维护就行了。

例题:B4016 树的直径

两遍 DFS 解法

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,sum,id;
vector<int>v[100005];
void dfs(int x,int fa,int len){if(len>=sum){sum=len,id=x;}for(auto z:v[x]){if(z!=fa){dfs(z,x,len+1);}}
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;for(int i=1,x,y;i<n;i++){cin>>x>>y;v[x].push_back(y);v[y].push_back(x);}dfs(1,-1,0);dfs(id,-1,0);cout<<sum;return 0;
}

树形 DP 解法

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,dp[200005],ans=-1e18,dp1[200005];
vector<int>v[200005];
void dfs(int x,int fa){for(auto z:v[x]){if(z!=fa){dfs(z,x);if(dp[x]<=dp[z]+1){dp1[x]=dp[x];dp[x]=dp[z]+1;}else if(dp1[x]<=dp[z]+1){dp1[x]=dp[z]+1;}}}ans=max(ans,dp[x]+dp1[x]);
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;for(int i=1,x,y;i<n;i++){cin>>x>>y;v[x].push_back(y);v[y].push_back(x);}dfs(1,-1);cout<<ans;return 0;
}

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

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

相关文章

基于51单片机的智能温控器设计与实现

一、前言 基于51单片机的智能温控器&#xff0c;使用DS18B20温度传感器来测量温度&#xff0c;并通过驱动风扇降温&#xff0c;同时使用LCD1602显示屏显示当前温度和设定温度。 二、51单片机代码 #include <reg52.h> //显示 #include <lcd.h>#define uchar unsi…

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied

近期如果有开发者的 iOS 真机升级到 18.4 beta&#xff0c;大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示&#xff0c;其实从 log 可以很直观看出来&#xff0c;就是 Dart VM 在初始化时&#xff0c;对内核文件「解释运行&#xff08;JIT&#xff09;」时…

架构师面试(九):缓存一致性

问题 关于【数据库和缓存】一致性&#xff0c;下面哪几项是在线上生产环境中相对合理的处理方式&#xff1f; A. 对于查询操作&#xff0c;先查缓存&#xff0c;如果为空则查 DB&#xff0c;然后将数据带入缓存&#xff1b; B. 对于插入操作&#xff0c;只写 DB 即可&#…

【CSS—前端快速入门】CSS 选择器

CSS 1. CSS介绍 1.1 什么是CSS? CSS(Cascading Style Sheet)&#xff0c;层叠样式表&#xff0c;用于控制页面的样式&#xff1b; CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff1b;能够做到页面的样式和 结构分离&#xff1b; 1…

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网&#xff1a;DeepSeek 点击“开始对话”&#xff0c;进入交互页面。 在上图中&#xff0c;输入问题&#xff0c;即可获取AI生成的结果。 基础模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…

学习笔记:IC存储总结(ROM,RAM, EEPROM, Flash, SRAM, DRAM, DDL)

一&#xff0c;概述 半导体存储器是一种可以存储大量二值信息的半导体器件。在电子计算机及一些其他的数字系统的工作过程中&#xff0c;需要对大量的数据进行储存。由于数据处理的数据量和运算速度的要求&#xff0c;因此把存储量和存取速度作为衡量存储器的重要指标。 在电子…

大语言模型学习

大语言模型发展历程 当前国内外主流LLM模型 ‌一、国外主流LLM‌ ‌LLaMA2‌ Meta推出的开源模型&#xff0c;参数规模涵盖70亿至700亿&#xff0c;支持代码生成和多领域任务适配‌57。衍生版本包括Code Llama&#xff08;代码生成优化&#xff09;和Llama Chat&#xff08;对…

【Block总结】EfficientViT中的多尺度线性注意力模块即插即用

论文信息 标题: EfficientViT: Multi-Scale Linear Attention for High-Resolution Dense Prediction作者: Han Cai, Junyan Li, Muyan Hu, Chuang Gan, Song Han&#xff08;MIT/浙江大学/清华大学/MIT-IBM Watson AI Lab&#xff09;[3][7]GitHub: mit-han-lab/efficientvit…

unsloth报错FileNotFoundError: [WinError 3] 系统找不到指定的路径。

运行平台 Windows 报错信息 Traceback (most recent call last): File “C:\Python312\Lib\site-packages\IPython\core\interactiveshell.py”, line 3577, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File “”, line 1, in runfile(‘D:\python_pr…

【清华大学】DeepSeek从入门到精通完整版pdf下载

DeepSeek从入门到精通.pdf 一共104页完整版 下载链接: https://pan.baidu.com/s/1-gnkTTD7EF2i_EKS5sx4vg?pwd1234 提取码: 1234 或 链接&#xff1a;https://pan.quark.cn/s/79118f5ab0fd 一、DeepSeek 概述 背景与定位 DeepSeek 的研发背景 核心功能与技术特点&#xff08…

如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南

ArcGIS Pro&#xff0c;作为Esri公司推出的新一代地理信息系统&#xff08;GIS&#xff09;平台&#xff0c;以其强大的功能和灵活的操作界面&#xff0c;在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中&#xff0c;图例作为地图的重要组成部分&…

监督学习单模型—线性模型—LASSO回归、Ridge回归

目标变量通常有很多影响因素&#xff0c;通过各类影响因素构建对目标变量的回归模型&#xff0c;能够实现对目标的预测。但根据稀疏性的假设&#xff0c;即使影响一个变量的因素有很多&#xff0c;其关键因素永远只会是少数。在这种情况下&#xff0c;还用传统的线性回归方法来…

【QT】QLinearGradient 线性渐变类简单使用教程

目录 0.简介 1&#xff09;qtDesigner中 2&#xff09;实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类&#xff0c;用于定义线性渐变效果&#xff08;通过样式表设置&#xff09;。它可以用来填充形状、背景或其他图形元素&#xff0…

攻防世界GFSJ1184_welcome_CAT_CTF

题目 附件&#xff1a; 两个文件client和server Get Flag Exeinfo File分析 file client client: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]6045aa1ba5…

EL表达式和JSTL标签

目录 1. EL表达式 1.1. EL表达式概述 1.2. EL表达式运算 1.3. EL表达式操作对象 1.4. EL表达式内置对象 jsp 9个 11个 1.4.1. 参数隐藏对象 1.4.2. 域隐藏对象 1.4.3. PageContext对象 2. JSTL标签 2.1. JSTL概述 2.1.1. 什么是JSTL 2.1.2. 导入标签库 2.2. JSTL核…

PhotoShop学习01

了解Photoshop 这里省略了Photoshop的软件安装&#xff0c;请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面&#xff0c;我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…

LabVIEW虚拟弗兰克赫兹实验仪

随着信息技术的飞速发展&#xff0c;虚拟仿真技术已经成为教学和研究中不可或缺的工具。开发了一种基于LabVIEW平台开发的虚拟弗兰克赫兹实验仪&#xff0c;该系统不仅能模拟实验操作&#xff0c;还能实时绘制数据图形&#xff0c;极大地丰富了物理实验的教学内容和方式。 ​ …

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像 文章目录 ADC原始数据C语言解析Python的2D-FFT图像附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput informati…

【数据结构】堆与二叉树

一、树的概念 1.1 什么是树&#xff1f; 树是一种非线性的数据结构&#xff0c;其由 n 个 ( n > 0 ) 有限节点所组成的一个有层次关系的集合。之所以称其为树&#xff0c;是因为其逻辑结构看起来像是一颗倒挂的树。 在树中&#xff0c;有一个特殊的节点称为根节点&#xf…

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…