P3478 题解 换根 dp 学习笔记

news/2024/9/22 18:24:30

换根 dp,又叫二次扫描,属于树形 dp 的范畴。一般具有一下几个特点:

  • 当指定的根节点不同时,题目求解的答案不同。
  • 在转移期间需要不止一个节点的信息。
  • 需两次 dfs,第一次为预处理,第二次为 dp 过程。

预处理

本题需要记录每个节点的两个信息:

  • 节点 \(u\) 的深度 \(d_u\)
  • 当树根为 \(1\) 时,以节点 \(u\) 为根的子树的节点数 \(\mathit{sz}_u\)。易得 \(\mathit{sz}_u = 1 + \sum_{v \in \operatorname{son}(u)} \mathit{sz}_v\)

换根 dp

\(f_u\) 为以 \(u\) 为根时所有节点的深度之和。\(\forall v \in \operatorname{son}(u)\),将原来的「以 \(u\) 为根」转移到「以 \(v\) 为根」。

考虑原来是 \(v\) 以及 \(v\) 的后代的节点,它们的深度将减少 \(1\)。而其他节点的深度会增加 \(1\)。故得转移方程:

\[f_v = f_u - \mathit{sz}_v + n - \mathit{sz}_v \]

参考代码
#include <bits/stdc++.h>
#define int long long
using namespace std;constexpr int N = 1e6 + 10;
int n, u, v, d[N], sz[N], f[N];
vector<int> tr[N];// 初始化
void init(int u, int fa = 0) {d[u] = u == 1 ? 0 : d[fa] + 1;sz[u] = 1;for (int i : tr[u])if (i != fa) {init(i, u);sz[u] += sz[i];}
}// 换根 dp
void dp(int u, int fa = 0) {for (int i : tr[u])if (i != fa) {f[i] = f[u] - sz[i] + n - sz[i];dp(i, u);}
}signed main() {ios::sync_with_stdio(0);cin.tie(nullptr), cout.tie(nullptr);cin >> n;for (int i = 1; i < n; i++) {cin >> u >> v;tr[u].emplace_back(v);tr[v].emplace_back(u);}init(1);f[1] = accumulate(d + 1, d + n + 1, 0ll);dp(1);cout << max_element(f + 1, f + n + 1) - f;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

python-爬虫入门

前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务。由于公司信息需保密,这里介绍个简单入门的爬虫脚本…

C10-05-2-X-ray简单使用

一、X-ray 主流应用漏洞扫描工具,也支持部分主机扫描功能(社区版+高级版) 下载: Github: https://github.com/chaitin/xray/releases (国外) CT stack: https://stack.chaitin.com/tool/detail?id=1 (国内)官方文档说明:快速开始 - xray Documentation首次运行会在同…

C10-05-1-Nmap常用参数说明

一、Nmap免责声明 本文仅是个人对该工具的学习测试过程记录,不具有恶意引导意向。 本文工具仅面向合法授权的企业安全建设行为,如您需要测试本工具的可用性,请自行搭建靶机环境。 在使用本工具进行检测时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿…

mysql安装(windows-mysql-8.1.0-winx64.zip安装)

1、官网下载,解压缩2、配置环境变量3、新增my.ini文件,根据电脑环境修改配置 # 设置mysql的安装目录 basedir # 设置mysql数据库的数据的存放目录 datadir my.ini文件内容如下: [mysqld]# 设置3306端口port=3306# 设置mysql的安装目录basedir=D:\kaifa\mysql-8.1.0-winx64# …

【游记】CSP-S2024游记

寄。CSP-S2024 游记展开目录 目录CSP-S2024 游记初赛9.21 上午9.21 下午初赛 9.21 上午 关于为什么从比赛当天开始,原因是我记性太差全忘了。 早上起来水了会谷,吃完饭出发。 同车 @Vsinger_洛天依 和 @JustinXaviel. 我和洛天依都不考钩组,所以把 JustinXaviel 送到地方之后…

UML在线工具的使用

UML在线编辑网站 https://plantuml.com/zh/class-diagram 模板(类方法显示) @startuml skinparam classAttributeIconSize 0 class Config {+load() +save() } @enduml

CSP2024-24

2A 题意:给定长度为 \(n\) 的非负整数数组 \(a\),求最小的 \(r−l+1\) 满足 \(l≤r,\sum_{i = l}^ra_i\) 是合数。 考虑全是正数的情况,答案一定 \(\le 4\),考虑一下每个数的奇偶性即可。 那么就把所有正数及其位置存下来,使得 \(b_i = a_{p_i}\),暴力检查 \(b\) 中长度为…