树的直径

更新日志 2025/01/12:开工。

前言

你知道吗?树的直径有三种求法。

两遍DFS

先任意点DFS,在最远点再DFS,两次最远点就是直径两端。

证明

树型DP-A

考虑对于每个点求出其向下的最长路径与次长路径(不同子树),其和就是经过该点且在其子树内的最长路径长度了。

所有节点取 \(\max\) 即可。

树型DP-B

对于每个点,储存其向下走的最长距离。

思路与A相同,但我们可以动态更新最长路径,并枚举可能的次长路径。代码可能更直观一点:

chmax(f[now],f[nxt]+mx+1);
chmax(mx,f[nxt]);
posted @ 2025-01-12 15:37  LastKismet  阅读(11)  评论(1)    收藏  举报