在写这篇题解之前,我想还是有必要聊一下这道题的关键技术,欧拉序。
首先,是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的问题上,反而更加好用。
回到本题,我们发现这题就是给一棵树,然后每次修改一条边的权值,求修改后的最大直径。不过修改完之后就恢复原样。
考虑求树

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

被折叠的 条评论
为什么被折叠?



