首页 > 其他分享 >树的直径问题

树的直径问题

时间:2023-07-24 19:48:23浏览次数:22  
标签:int 路径 问题 k1 该点 直径 dp

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

显然,一棵树可以有多条直径,他们的长度相等。

可以用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。

两次DFS

这是一种非常容易理解的方法

从树上任意一点出发,进行 dfs ,记其所能到达最远的点(即所经路径之和最大)为 k1

再从 k1 点出发进行 dfs ,记其所能到达最远的点(即所经路径之和最大)为 k2

那么 k1 , k2 之间的路径即为树的直径

树形DP

这里介绍树形 DP 方法

首先观察以下图

现在取任意一点,将其所能经过的最长路径与次长路径(与最长路径无公为共边)记录下来,那么

  1. 如果该点位于直径上,那么两者之和即为路径长
  2. 如果该点不位于直径上,那么该点的两者之和一定小于直径长

这里从一个点出发所能到达的最长和次长路径的终点 相当于(尝试)碰到 k1, k2两点

为了便于操作,我们定义当 1 为树的根时,将每个节点作为其子树的根,向下所能延伸的最长路径长度为 d1 ,次长路径(与最长路径无公为共边)长度为 d2,那么直径就是对于每一个点,该点 d1 + d2 能取到的值中的最大值。

f1[]为最长距离,f2[]为次长距离

树形dp求直径
void dp(int x,int fa)
{
    for(int i=head[x];i!=-1;i=e[i].next)链式前向星存树
    {
        int v=e[i].to;
        if(v==fa) continue;//防止原路返回
        dp(v,x);//dp过程应该是由叶节点开始的,也就是说先递归到叶节点再开始进行状态转移
        if(f1[x]<f1[j]+e[i].w)//如果子节点的最大距离+子节点与父节点之间边的权重大于父节点的最大距离,那么父节点的最大距离和次大距离都要得到相应更新
        {
            f2[x]=f1[x];
            f1[x]=f1[j]+e[i].w;
        }
        else if(f2[x]<f1[j]+e[i].w)//若子节点的最大距离+子节点与父节点之间边的权重小于父节点的最大距离,再判断与父节点的次大距离的关系
            f2[x]=f1[j]+e[i].w;
        ans=max(ans,f1[x]+f2[x]);//在搜索过程中找到树的直径
    }
}

标签:int,路径,问题,k1,该点,直径,dp
From: https://www.cnblogs.com/pigAlg/p/17578124.html

相关文章

  • 线性 DP、背包问题、区间 DP 学习笔记
    动态规划基础知识基本概念动态规划:解决多阶段决策过程最优化问题的一种方法。阶段:把问题分解成相互联系的有顺序的几个环节,这些环节即成为阶段。状态:某一阶段的出发位置称为状态。通常一个阶段包含若干状态。决策:从某阶段的一个状态演变到下一个阶段某状态的选择。策略:由开......
  • 问题--VSCODE终端中文乱码问题
    1.问题问题如下,终端出现中文乱码问题根本原因是VSCODE是UFT-8编码,而终端显示的中文则是GBK编码网上很多都是改VSCODE为GBK编码,但改终端为UFT-8也挺方便2.解决方法1.在终端输入chcp65001在重启vscode或者重新打开项目文件时需重新再vscode的虚拟终端输入chcp65001,但是在重......
  • 解决非同源跨域不带cookie问题(原生、axios、fetch写法)
    原生js写法varxhr=newXMLHttpRequest();xhr.open('GET','http://localhost:7001/api/userinfo',true);xhr.withCredentials=true;//开启withCredentialsxhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.stat......
  • 【idea编译问题】可以找打对应的class 但是 idea 提示 java: 找不到符号
    可以找打对应的class但是idea提示java:找不到符号这个问题有的时候,可能是lombock引起的,可以在maven编译的时候填写-Djps.track.ap.dependencies=false......
  • DNS解析常见问题:如何为网站配置负载均衡?
    DNS解析常见问题:如何为网站配置负载均衡?早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求。随着现在互联网的流量越来越大,系统功能也越来越复杂,单台服务器就算将性能优化得再好,也不足以支撑太大流量的访问压力了,这个时候就需要使用多台机器,......
  • sourecetree无法打开/闪退的问题
    1、问题分析sourecetree之前可以正常使用,突然出soure无法正常打开的问题2、问题解决注:本文sourcetree安装在win11系统,win10等系统目录大同小异①(若快捷方式在桌面步骤①省略,直接进入步骤②)在sourcetree图标上右键选择[打开文件位置],博主是在win11的"开始"屏幕固定处右击的......
  • 国标GB28181视频平台LntonGBS(含源码)国标视频平台播放视频时偶尔出现播放失败的问题解
    LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲等功能,能够涵盖所有监控领域的视频能力需求,已经在大量的项目中落地应用,如明厨亮灶、平安乡村、雪亮工程等。有用户反馈,在某项......
  • 如何发现及处理 MySQL 主从延迟问题
    在PerconaMySQL支持团队中,我们经常看到客户抱怨复制延迟的问题。当然,这对MySQL用户来说并不是什么新鲜事,多年来我们在MySQL性能博客上发表过一些关于这个主题的文章(过去有两篇特别受欢迎的文章:"ReasonsforMySQLReplicationLag"和“ManagingSlaveLagwithMySQLRep......
  • mpc库问题导致gcc编译失败
    使用mpc-1.3.0编译gcc-13.1.0,执行gcc的configure时遇到如下错误:checkingforthecorrectversionofgmp.h...yescheckingforthecorrectversionofmpfr.h...yescheckingforthecorrectversionofmpc.h...noconfigure:error:BuildingGCCrequiresGMP4......
  • Windows多重连接问题
    先叙述我的问题出现情况:我在Windows域账号中使用smb连接Linux服务器的共享文件夹时报多重连接的错,报错具体信息:“不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接,然后再试一次。”查找并测试过但不成功的方法:1.删除Windows......