D. Rush Morning(欧拉序+线段树) 树的动态直径

文章介绍了在处理树形结构的问题时,欧拉序和DFS序的作用,特别是它们在转化树为线性结构和进行区间操作中的应用。文章以求解树的最大直径为例,阐述了如何利用欧拉序来维护节点间的最近公共祖先(LCA)信息,并通过区间最大值和最小值来优化算法。最后,给出了具体的代码实现,展示了如何在边权修改后求解树的直径并恢复原状。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

在写这篇题解之前,我想还是有必要聊一下这道题的关键技术,欧拉序。

首先,是dfs序。dfs序就是在dfs时遍历节点的顺序。

(画的比较抽象)

dfs序的用处在于将树形结构转化为线性结构。以上图为例,遍历顺序为A-B-C-D-E-F。我们会发现B,C,D在同一颗子树上,而在dfs序中,他们表现为一段连续的区间,这样,对原本子树上的操作,如整体加减乘除等等,都可以转化为线性结构上的操作,也就是区间操作,这个时候我们就可以用线段树进行维护了。

除dfs序外,还有一个序列,大体和dfs序差不多,但每个节点进入和离开视为两个点,这种括号序基本可以看作是dfs序的延伸。

 当然,树上问题最重要的还是lca,可惜的是dfs序并不能很好的维护两个节点的最近公共祖先的信息,于是我们今天的主角--欧拉序就出来了。

与dfs序不同,每个节点的遍历次数与该节点的度有关,我们能看到,上图的欧拉序为A-B-C-B-D-B-A-E-F-E-A。 最后总的序列个数应该为2n-1个。我们发现,和dfs序类似,该节点第一次出现到最后一次出现的区间就是该节点的子树部分,同时任意两个节点之间的路径一定会经过他们的lca,同时我们也能发现lca一定是这个区间深度最低的点。虽然我们因此维护子树和之类的信息变得复杂(因为实际上这些区间不连续了,对于区间求和来说,他存在一些多余的信息需要处理),但是在涉及lca的问题上,反而更加好用。

回到本题,我们发现这题就是给一棵树,然后每次修改一条边的权值,求修改后的最大直径。不过修改完之后就恢复原样。

考虑求树

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值