DP过程
const int N = 1e6+7;
int Size[N] // Size[i]表示以i为根的子树的结点数
int dp[N] //dp[i]表示树中所有点到结点i的距离和
dp[son]=dp[pos]+(Size[1]-Size[son])-Size[son];
//状态转移方程
预处理
洛谷P1364 医院设置
[P1364 医院设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1364)
分析
如果你非要用换根dp做的话。
那么这道题与模板的变化点就在于我们并不是要求树中点到某点的距离和最小
而是要求所有居民走的距离最短。
但换汤不换药,我们只要将每个Size[i] 初始化为i的点权就可以了
理由是:
当我们换根 i->j 时, j 的子树内所有的居民少走1个单位距离, j的子树外的所有居民多走1个单位距离。仍然与我们的换根dp实质相同
代码
cpp
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
洛谷P1395会议
比上一题还简单,没意思的模板题。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include