main
黄海 2 years ago
parent beb8fd531d
commit 0b23ef0f07

@ -15,13 +15,17 @@ int val[N]; // 点权数组
int n, k;
void dfs1(int u, int fa) {
for (int i = 0; i <= k; i++) f[u][i] = val[u];
// 初始化当遍历到u节点时u的拆分状态中最起码包含了自己的点权值
for (int i = 0; i <= k; i++) f[u][0] = val[u];
// 枚举u的每一个子节点
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (v == fa) continue;
dfs1(v, u);
if (v == fa) continue; // 如果是u的父亲那么就跳过,保证只访问u的孩子
dfs1(v, u); // 递归填充v节点的信息
// 在填充完子节点v的统计信息后利用儿子们的填充信息完成父亲节点信息的填充
// for(j=1,j<k,j++): 填充f[u]的每一个子状态孩子们的j=1层汇集的数据累加在一起就是f[u][j]的数据
// 最多计算k层足够用了
for (int j = 1; j <= k; j++) f[u][j] += f[v][j - 1];
}
}

Loading…
Cancel
Save