换根dp
特征
- 是一种树形 \(dp\);
- 所给出的树形结构为无根树,或某两个相邻的点的父子关系是不确定的;
- 要求求出每个节点答案。
解法
一般进行两次 \(dfs\):
- 第一次指定一个节点为根(通常为 \(1\))进行第一次 \(dp\),求出整个树在以 \(1\) 为根时的答案;
- 第二次进行换根,一般是将当前节点与第一次 \(dfs\) 中的父亲节点进行交换。
\(dp\) 顺序:
- 第一次 \(dp\) 计算当前节点的答案要用到子节点的答案,因此 \(dp\) 顺序为由叶子节点到根节点;
- 第二次 \(dp\) 继续计算当前节点的答案要用到父节点的答案,因此 \(dp\) 顺序为由根节点到叶子节点。
注意:换根时要注意第一次 \(dp\) 中 \(dp[fa]\) 的答案贡献会有来自 \(dp[u]\) 的部分,此时如果直接将 \(fa\) 变为 \(u\) 的子节点,然后 \(dp[u]\) 直接加上 \(dp[fa]\),那么就会出现重复计算的情况。因此要将 \(dp[fa]\) 先减去 \(dp[u]\) 再继续向下递归 \(dp\)。

浙公网安备 33010602011771号