【做题记录】[POI2008]STA-Station

  • \(\text{[POI2008]STA-Station}\)

    • 算法:树形 \(\text{dp}\),换根,二次扫描

题目:

给定一个 \(n\) 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大。

一个结点的深度之定义为该节点到根的简单路径上边的数量。

\(n\le 10^6\)

题解:

记录一下这题,因为这题有个挺妙的小 trick。

首先不妨设 \(1\) 号节点为根。

然后对于一个 \(v\),设 \(u=fa(v)\)

再求完 \(v\) 的答案后,考虑如何转移到 \(u\)

trick: 一种换根。将 \(v\) 为根换位 \(u\) 为根后能发生什么?

\(v\) 的整棵子树(包括 \(v\))的每个节点的深度都会加 \(1\),因为从 \(v\) 为根到 \(v\) 的父亲为根整棵子树总体下降了一层。

同样地有 \(u\) 的整棵子树(包括 \(u\))的每个节点深度减 \(1\)

这样就可以从 \(v\) 转移至 \(u\)

于是这个树形 \(\text{dp}\) 就显而易见了。

posted @ 2022-01-07 19:36  trsins  阅读(24)  评论(0编辑  收藏  举报