题目连接
- 树形DP专题
题目大意
- 给出一棵带边权的树;
- 问1:求出树的直径;
- 问2:有多少对点的距离等于树的直径。
题目分析
- 直径的定义: 树上最长的链(可能有多条)。
- 求树的直径的方法1:用两次dfs来完成
dfs1从根出发,找到最远的叶子结点 k k k;
dfs2以 k k k 为根,出发,找到离他最远的点 t t t , k k k 与 t t t 之间的距离就是直径。 - 求直径的做法2:dp的思维来实现
从根出发,搜索的过程中,同时记录最长链与次长链,回溯的时候更新。 - 本题解抄的就是方法2,而且更巧妙的是,用一个缓存 t m p tmp tmp 来记录可能最长链,节省了一丁点的空间。
解题流程
- 从根,开始搜索:
- 回溯到 x x x 的时候 5 个操作:
- 1 用 t m p tmp tmp 记录经过 y y y 的最长链长度:
t m p = l e n [ y ] + e ( x , y ) ; tmp=len[y]+e(x,y); tmp=len[y]+e(x,y); 其中 e ( x , y ) e(x,y) e(x,y) 是 ( x , y ) (x,y) (x,y) 之间的边长; - 2 如果 a n s < t m p + l e n [ x ] ans<tmp+len[x] ans<t
- 1 用 t m p tmp tmp 记录经过 y y y 的最长链长度:

这是一篇关于解决树的直径问题的博客,采用动态规划(dp)的方法。文章介绍了两种策略:一种是两次dfs,另一种是利用dp记录最长链和次长链。在dp策略中,通过一个缓存tmp优化了空间使用。解题流程包括从根节点开始搜索,并在回溯过程中更新最长链长度和涉及点的数量。
最低0.47元/天 解锁文章
9万+

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



