前言

没脑子选手什么都不会。

正文

先来写一下换根 DP 的特点或应用方面:

  • 不同的点作为树的根节点,答案不一样。
  • 求解答案时要求出每一个节点的信息。
  • 无法通过一次搜索完成答案的求解,因为一次搜索只能得到一个节点的答案。

下面来看一个例子:

给定一个 \(n\) 个点的无根树,问以树上哪个节点为根时,其所有节点的深度和最大。

一个显然的做法:枚举根节点然后 \(O(n)\) 暴力,复杂度 \(O(n^2)\) 。能过我 CS

所以我们考虑换根 DP 。

  • 先以 \(1\) 节点为根节点算出每个点的深度 \(deep_i\) 和每个点为根的子树大小 \(siz_i\)
  • 那么此时我们就知道了 \(1\) 为根节点时的答案 \(ans_1=\sum deep_i\) 。
  • 接下来我们来看第二遍 \(\text{dfs}\) ,考虑如何由 \(ans_1\) 转换到 \(ans_i\) 。
  • 因为还是从 \(1\) 节点开始向下遍历,所以默认 \(t\) 是 \(u\) 的孩子节点。
  • 很显然,转移的时候把树分成两个块:1.本来就是 \(t\) 的子树 2. 原来不是 \(t\) 的子树。
  • 先来考虑原来就是 \(t\) 子树的情况:每一个节点的值都要减一,所以 ans -= siz[t]
  • 在来考虑另一种情况:每个节点显然答案加一,所以 ans += n - siz[t]
\[ans_t=ans_u+n-2\times siz_t
\]

Code

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm> #define file(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout) #define Enter putchar('\n')
#define quad putchar(' ') #define int long long
const int N = 1000005; int n, deep[N], siz[N], f[N];
std::vector <int> dis[N]; inline void dfs1(int now, int father) {
deep[now] = deep[father] + 1;
siz[now] = 1;
for (int t : dis[now]) {
if (t == father) continue;
dfs1(t, now);
siz[now] += siz[t];
}
} inline void dfs2(int now, int father) {
for (int t : dis[now]) {
if (t == father) continue;
f[t] = f[now] + n - 2 * siz[t];
dfs2(t, now);
}
} signed main(void) {
// file("P3478");
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin >> n;
for (int i = 1, x, y; i < n; i++) {
std::cin >> x >> y;
dis[x].emplace_back(y);
dis[y].emplace_back(x);
}
dfs1(1, 0);
for (int i = 1; i <= n; i++)
f[1] += deep[i];
dfs2(1, 0);
int ans = 0, out;
for (int i = 1; i <= n; i++) {
if (f[i] > ans) {
ans = f[i];
out = i;
}
}
std::cout << out << std::endl;
return 0;
}

所以我们可以发现:

换根 DP 一般都是先选择任意一个点为根节点预处理出一些有用的信息。

然后第二遍 dfs 时再根据已知的答案推出其他节点的答案。

换根 DP 学习笔记的更多相关文章

  1. [算法学习] 换根dp

    换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^ ...

  2. 树形DP 学习笔记

    树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...

  3. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  4. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  5. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  6. DP学习笔记

    DP学习笔记 可是记下来有什么用呢?我又不会 笨蛋你以后就会了 完全背包问题 先理解初始的DP方程: void solve() { for(int i=0;i<;i++) for(int j=0 ...

  7. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

  8. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  9. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

随机推荐

  1. 小米手机简单 ROOT教程(百分百成功)

    大家都知道啊,由于小米自带的换机软件不支持一些应用数据的还原,所以需要使用钛备份来还原应用和数据.但是钛备份需要root才能用,因为有些机器刚出没多久,第三方的recovery也没有,所以需要找到一种 ...

  2. Markdown学习-Typora

    author:涂勇军 标题 (#加一个空格)一级标题 (##加一个空格)二级标题 (###加一个空格)三级标题 (####加一个空格)四级标题 字体 加粗:** hello,World **(快捷键是 ...

  3. 关于visualvm无法监控本地java进程

    https://blog.csdn.net/weixin_43827693/article/details/105990675?spm=1001.2101.3001.6661.1&utm_me ...

  4. C#/VB.NET 获取Excel中图片所在的行、列坐标位置

    本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置.这里的坐标位置是指图片左上角顶点所在的单元格行和列位置,横坐标即顶点所在的第几列.纵坐标即顶点所在的第几行.下面是获取图 ...

  5. Istio实践(4)- 故障注入、熔断及ServiceEntry

    前言:接上一篇istio多服务应用部署及调用,本文介绍通过流量管理(故障注入.请求超时等)以及ServiceEntry外部服务部署应用 1.设置服务延迟 修改springbootapp-vs-v1.y ...

  6. FreeRTOS --(3)内存管理 heap2

    在<FreeRTOS --(2)内存管理 heap1>知道 heap 1 的内存管理其实只是简单的实现了内存对齐的分配策略,heap 2 的实现策略相比 heap 1 稍微复杂一点,不仅仅 ...

  7. vmware安装或卸载时,显示无法打开注册表项

    ​ vmware卸载是出了名的臭名昭著,因为太难删干净了,删不干净又会有各种各样的问题.比如下文这个"无法打开注册表项" 这个我相信有很多人在重装vmware的时候遇到过,因此我来 ...

  8. Linux服务器安全加固10条建议

    以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过. 设置复杂密码 服务器设置大写.小写.特殊字符.数字组成的12-16位的复杂 ...

  9. Mysql数据库基础_复习思维导图

    Mysql复习的一个小总结,用xmind写的.(字数没有都不给我发博客) 下面是一些备注 子查询 MySQL子查询称为内部查询,而包含子查询的查询称为外部查询. 子查询可以在使用表达式的任何地方使用, ...

  10. 管家婆财贸ERP系列功能对比财贸c3-c8-c9功能对比介绍

    管家婆财贸ERP系列功能对比财贸c3-c8-c9功能对比介绍 管家婆财贸ERP产品功能 序号 名称 说明 一 采购管理 对日常订货.入库.退货.估价入库等业务进行处理,多种方便灵活的订单定制方式,实现 ...