qoj9230 Routing K-Codes 题解

首先这个图肯定不能有环,也不能有度数大于 \(3\) 的点。

也就是说这是一颗二叉树。我们假设父亲都比儿子小,根节点的值最小。

那么假设 \(u\) 点的值为 \(x\),它的儿子的值一定是 \(\{2x,2x+1\}\) 的子集。会发现 \(u\) 的子树内的权值和是一个关于 \(x\) 的一次函数。而且无论两个儿子中哪个取 \(2x\),哪个取 \(2x+1\),这个函数的斜率 \(k\) 都是不变的,影响的只是常数 \(b\) 的值。(这个可以手推验证一下)。于是我们就可以 dp 了。

\(dp_u=(k,b)\) 表示当 \(u\) 的值为 \(x\) 时,子树内的权值和最少为 \(kx+b\)\(k\) 一定,其实最小化的是 \(b\))。转移很简单,分类讨论哪个儿子为 \(2x\),哪个为 \(2x+1\) 即可。然后换根一下就可以求出以每个点为根时的 dp 值了。

\(u\) 为根时,如果 \(u\) 的度数为 \(1\),那么 \(x=0\)。否则 \(x=1\)。再带入 \(k,b\) 就可以计算答案了。

需要注意 \(x < 2^{32}\),也就是深度不能超过 \(32\),需要判一下。

posted @ 2024-10-05 15:51  Creeper_l  阅读(23)  评论(0编辑  收藏  举报