diff --git a/TangDou/Topic/HuanGenDp/CF1406C.cpp b/TangDou/Topic/HuanGenDp/CF1406C.cpp index 7088ddf..82618e2 100644 --- a/TangDou/Topic/HuanGenDp/CF1406C.cpp +++ b/TangDou/Topic/HuanGenDp/CF1406C.cpp @@ -21,12 +21,15 @@ void dfs(int u, int fa) { for (int i = h[u]; ~i; i = ne[i]) { // 枚举u的每一条出边 int v = e[i]; if (v == fa) continue; - dfs(v, u); // 先把v为根的子树遍历完 - sz[u] += sz[v]; // 把 v中获取填充的sz[v]值,用于组装自己sz[u] - son[u] = max(son[u], sz[v]); + dfs(v, u); // 先把v为根的子树遍历完 + sz[u] += sz[v]; // 把 v中获取填充的sz[v]值,用于组装自己sz[u] + son[u] = max(son[u], sz[v]); // 如果把u节点去掉,那么它的所有子节点v为根的子树中节点数,可以参加评选: + // 评选的标准是:son[i]:去掉节点i后,剩下的连通分量中最大子树节点个数 } - son[u] = max(son[u], n - sz[u]); - if ((son[u] << 1) <= n) r2 = r1, r1 = u; + son[u] = max(son[u], n - sz[u]); // 右上角的那一块也可能成为评选的获胜者 + if ((son[u] << 1) <= n) r2 = r1, r1 = u; // 删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心 + // 如果模拟u被删除后,得到的所有子树中节点数量最多的没有超过原树的1/2,那么这个r1=u表示:找到了一个重心u + // r2=r1表示:如果找到两个重心,那么r1,r2 一人一个,此时,r1中肯定有值,但 r2不一定有值 } signed main() {