From 225971cdaabb4efa5ff880eb7833e2a386b54fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 16 Jan 2024 15:39:24 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HuanGenDp/P6419.cpp | 5 ++-- TangDou/Topic/【换根DP】专题.md | 40 +++++++++++++++------------ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/TangDou/Topic/HuanGenDp/P6419.cpp b/TangDou/Topic/HuanGenDp/P6419.cpp index ed71ba8..82afe68 100644 --- a/TangDou/Topic/HuanGenDp/P6419.cpp +++ b/TangDou/Topic/HuanGenDp/P6419.cpp @@ -50,10 +50,11 @@ void dfs2(int u, int fa) { for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (v == fa) continue; - if (!sz[v]) + if (sz[v] == 0) g[v] = g[u] + 2 * w[i], len[v] = len[u] + w[i]; - else if (m - sz[v]) { + else if (m - sz[v] > 0) { g[v] = g[u]; + if (id[u] != v && len[v] < len[u] + w[i]) slen[v] = len[v], len[v] = len[u] + w[i], id[v] = u; else if (len[v] < slen[u] + w[i]) diff --git a/TangDou/Topic/【换根DP】专题.md b/TangDou/Topic/【换根DP】专题.md index 543e668..13a4916 100644 --- a/TangDou/Topic/【换根DP】专题.md +++ b/TangDou/Topic/【换根DP】专题.md @@ -1035,34 +1035,38 @@ void dfs1(int u, int fa) { 令 $g[u]$ 为对于整棵树从 $u$ 开始送人 **最后回到 $u$ 的最短距离** -接下来我们就要开始分类了: -1、当以 $u$ 为根的子树中没有人的家,即 $sz[u] =0$ 时,我们发现 $g[v]=g[u]+2\times w_{u \rightarrow v}$​ ,很好理解,不多说了(画画图就好了 -2、当除了以$u$ 为根的子树其他地方没有人的家,即 $K−sz[u]=0$时,可以发现 $g[v]=f[v]$ -​ -3、 其他情况,即$sz[u] \neq 0$ 且 $m-sz[u] \neq 0$时,发现$g[v]=g[u]$ - -那么,更新完 $g$ 之后,我们就要考虑如何更新最长链和次长链了 +接下来分类讨论: -这也是本题最烦的地方了 +(1)、当以 $v$ 为根的子树中没有人的家,即 $sz[v] =0$ 时, $g[v]=g[u]+2\times w[i]$ + +(2)、当除了以$v$ 为根的子树其他地方没有人的家,即 $m−sz[v]=0$时, $g[v]=f[v]$ + +(3)、 其他情况,$sz[v] \neq 0$ 且 $m-sz[v] \neq 0$时,$g[v]=g[u]$ + + + +更新完 $g$ 之后,考虑如何更新最长链和次长链 依旧分类讨论,依旧是上面三类(这里编号就代表上面的情况) -1、这种情况可以发现 $len[v]=len[u]+w_{u→v}$ ,很简单 +(1)、这种情况可以发现 $len[v]=len[u]+w[i]$,很简单 + +(2)、这种情况很容易发现完全没有必要更新 -2、这种情况很容易发现完全没有必要更新 +(3)、最烦的情况来了,这种情况下我们还要分类讨论 + ① 当 $len[u]+w≥len[v]$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 + ② 当 $len[u]+w≥len[v]$ 且 $id[u] = v$ 时,说明虽然 $u$ 的最长链的长度可以更新 $v$,但是若更新了这就不是一条链了,所以也不可以来更新 + ③ 当 $slen[u]+w≥len[v]$时, 说明 $u$ 的次长链可以用来更新 $v$ 的最长链,直接更新即可 + ④ 当 $len[u]+w≥slen[v]$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 + ⑤ 当 $len[u]+w≥slen[v]$ 且$id[u]=v$ 时, 这时与$2$)同理,不可以更新 + ⑥ 当 $slen[u]+w≥slen[v]$ 说明 $u$ 的次长链可以更新 $v$ 的次长链,直接更新即可 -3、最烦的情况来了,这种情况下我们还要分类讨论 -① 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 -② 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 -③ 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 -④ 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 -⑤ 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 -⑥ 当 $len[u]+w≥len$ 且 $id[u] \neq v$ 时,说明 $u$ 的最长链可以更新 $v$ 的最长链,那么直接更新即可 +到这里,第二次$dfs$就做完了 +#### [$CF708C$ $Centroids$](https://www.luogu.com.cn/problem/CF708C) -####[$CF708C$ $Centroids$](https://www.luogu.com.cn/problem/CF708C) https://blog.csdn.net/TheSunspot/article/details/118216638 https://www.cnblogs.com/DongPD/p/17498336.html