【做题记录】[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}\) 就显而易见了。