From 4c48760d70f42b207fb52a5d3a7c2246cb5d004a 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:07:58 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HuanGenDp/P6419.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/TangDou/Topic/HuanGenDp/P6419.cpp b/TangDou/Topic/HuanGenDp/P6419.cpp index 8c8ec74..ed71ba8 100644 --- a/TangDou/Topic/HuanGenDp/P6419.cpp +++ b/TangDou/Topic/HuanGenDp/P6419.cpp @@ -11,8 +11,10 @@ void add(int a, int b, int c = 0) { e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; } -int sz[N]; // 哪个点上有人 -int len[N], id[N], slen[N]; +int sz[N]; // 哪个点上有人 +int len[N]; // len[u]:经过u的最长链 +int id[N]; // id[u]:最长链的第一节点 +int slen[N]; // slen[u]:经过u的次长链 int f[N], g[N]; void dfs1(int u, int fa) { @@ -29,11 +31,17 @@ void dfs1(int u, int fa) { // ② 所有子节点都对u有贡献,所以f[u]+ // ③ 跑完v为根的子树后,v子树的贡献要累加到u子树上,所以f[u]+=f[v]+2*w[i] f[u] += f[v] + 2 * w[i]; - int now = len[v] + w[i]; - if (now >= len[u]) - slen[u] = len[u], len[u] = now, id[u] = v; - else if (now > slen[u]) - slen[u] = now; + + // len[v]:v点出发的最长链长度 + int x = len[v] + w[i]; + + // 更新最长链 + if (x >= len[u]) + slen[u] = len[u], len[u] = x, id[u] = v; + else if (x > slen[u]) // 更新次长链 + slen[u] = x; + + // 记录累计人数 sz[u] += sz[v]; } }