题目连接
- 树形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 <
- 1 用 t m p tmp tmp 记录经过 y y y 的最长链长度: