给定一棵树,树上每个节点 i 的代价为节点深度乘节点权值 wi,总代价为所有节点代价之和。我们能够将一棵子树裁剪下来,并接到根节点 1 下,求操作后最小的总代价。
树的深度能够通过一次遍历得到结果,因此每个节点的代价也能够在计算深度的同时计算出来。
为了让总代价最小,一个很直观的想法就是,将裁剪出来的这棵子树嫁接到根节点,也就是 1 号节点下。
定义:sum[i] 表示节点 i 及其子树的权值之和(不乘深度),depth[i] 表示第 i 个节点的深度。
给定一棵以 1 为根的树,共有 n 个节点,每个节点 i 有一个权值 wi。定义节点深度:根节点深度为 1,子节点深度为父节点深度加 1。初始总代价 C=∑i=1ndi⋅wi,其中 di 为节点 i 的初始深度。
你可以执行至多一次操作:选择一个非根节点 u,将以 u 为根的整个子树从其当前父节点处剪下,然后直接挂到根节点 1 下,使其成为根节点的孩子。操作后,子树内所有节点的深度都减少 du−2。
你的目标是使操作后的总代价尽可能小。请求出最小可能的总代价。
约束:
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.