何为树的直径,
简单来说其实就是在一棵树上, 距离最远的两个点的距离.
如何求直径
- b f s ( d f s ) bfs(dfs) bfs(dfs):第一次 b f s ( d f s ) bfs(dfs) bfs(dfs) :从任意节点出发, 求出到该节点最远的节点 p p p, 然后进行第二次 b f s ( d f s ) bfs(dfs) bfs(dfs), 求出到 p p p最远的节点 q q q, p p p到 q q q的路径长度即为树的直径.
- 树形 d p dp dp: 设 d p [ x ] dp[x] dp[x]表示从节点 x x x出发走向以 x x x为根的子树,能够到达的最远节点的距离, 设集合 y 1 , y 2 , y 3 , . . . . . . y t {y1, y2, y3,......yt} y1,y2,y3,......yt为 x x x的子节点, e d g e ( x , y ) edge(x,y) edge(x,y)为边的权值大小, 则状态转移方程为 d p [ x ] = max 1 < = i < = t d p [ y i ] + e d g e ( x , y i ) dp[x]=\displaystyle\max_{1<=i<=t}{dp[y_i] + edge(x,y_i)} dp[x]=1<=i<=tmaxdp[yi]+edge(x,yi), 接下来我们考虑对于每个节点 x x x求出经过 x x x的最长链的长度 l e n [ x ] len[x] len[x], max 1 < = i < = n l e n [ i ] \displaystyle\max_{1<=i<=n}len[i]