思路
官方题解写的很清楚,将原边看成白边,折扣边看成黑边,求恰好黑边数为 k k k的最小生成树。
这边有道一模一样的子问题BZOJ2654-tree.
我们需要设定一个 x x x值,对每条黑边的长度算上 + x +x +x的贡献,然后进行一次最小生成树,假如最小生成树的最终值为 s u m sum sum,选择了 c n t cnt cnt条黑边,那么最小生成树的值就是 s u m − c n t ∗ x sum-cnt*x sum−cnt∗x。因为题目所给的边的范围为 [ 0 , 1000 ] [0,1000] [0,1000],所以 x x x的范围为 [ − 1000 , 1000 ] [-1000,1000] [−1000,1000].这样可以保证每一种黑边的情况。
在计算之前,首先可以把图缩小到 o ( n ) o(n) o(n)的级别,假如没有黑边,就是一个所有白边的最小生成树,没有白边,就是一个所有黑边的最小生成树。这样只有 O ( 2 n ) O(2n) O(2n)条边,那么对于最终黑白边混合的最小生成树,其所选的边一定是从这 2 n 2n 2n条边中选择。
同时我们可以发现,当 x x x值越小的时候,选择的黑边就会越多,满足单调性。
对于寻找边数恰好为 k k k的最小生成树,就有以下做法:
1、二分一个 x x x,将所有的黑边的权值