|
|
|
@ -783,18 +783,15 @@ int n, k;
|
|
|
|
|
|
|
|
|
|
void dfs1(int u, int fa) {
|
|
|
|
|
// 初始化:当遍历到u节点时,u的拆分状态中,最起码包含了自己的点权值
|
|
|
|
|
for (int i = 0; i <= k; i++) f[u][0] = val[u];
|
|
|
|
|
for (int i = 0; i <= k; i++) f[u][i] = val[u];
|
|
|
|
|
|
|
|
|
|
// 枚举u的每一个子节点
|
|
|
|
|
for (int i = h[u]; ~i; i = ne[i]) {
|
|
|
|
|
int v = e[i];
|
|
|
|
|
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层足够用了
|
|
|
|
|
// 先递归,// 递归填充v节点的信息
|
|
|
|
|
dfs1(v, u);
|
|
|
|
|
// 再利用子节点信息更新父节点信息
|
|
|
|
|
for (int j = 1; j <= k; j++) f[u][j] += f[v][j - 1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|