【换根DP】AcWing 4381. 翻转树边
2022-03-31 19:45:00
# ACM
题链
https://www.acwing.com/problem/content/description/4384/
题解
- 考虑换根 DP;
- u 向 v 连有向边则 dis(v, u) 记为 1,dis(u, v) = 0;
- 考虑以 1 为根节点
- 设 g[u] 表示以 u 为根节点的子树 从 u 到子树下所有点所需代价:
- g[u] = g[vi] + dis(u, v);
- 设 f[u] 表示以 u 为中心的答案:
- f[1] = g[1];
- f[v] = g[v] + ( f[u] - (g[v] + dis(u, v)) ) + dis(v, u);
- 化简可得 f[v] = f[u] - dis(u, v) + dis(v, u);
- 对于 等式 右边的三部分
- g[v] : 就是以 v 的子树的贡献
- f[u] - (g[v] + dis(u, v)) : 就是除了 ( v 的子树和 (u, v) 这条边 ) 的贡献
- dis(v, u) : 就是最后一部分 (v, u) 这条边的贡献
- 于是第一次 dfs 求 g[],第二次求 f[]
代码
1 |
|