「HDU-2196」Computer
树形dp,树的最长路径(最远点对)
题意
给出一棵$n$个结点的无根树,求出每个结点所能到达的最远点的距离。
解法
将无根树转成有根树,并进行两次DFS。
第一次DFS求出每个结点在其子树中的正向最大距离和正向次大距离,记为
longest[i]
和secondary[i]
,并标记最长距离所对应的子结点mark[i]
;此时可知对于每个结点$i$,最远点的距离只有两种可能:
- 结点$i$的正向最大距离
- 结点$i$链接其父结点所能到达的最大距离,即反向最大距离
第二次DFS求出反向最长距离
top[i]
若其父节点的正向最大距离不经过$i$,反向最大距离为父节点的正向最大距离/反向最大距离+连接边
$$top[i]=max(top[fa],longest[fa])+edge[fa][i]$$
否则,反向最大距离为父节点的正向次大距离/反向最大距离+连接边
$$top[i]=max(top[fa],secondary[fa])+edge[fa][i]$$
最终所求每个点的最大距离$ans[i]=max(longest[i],top[i])$
代码
1 |
|