题目大意:
一张(N)个结点(M)条边的无向图,每条边有两个权值(a,b),求一颗生成树满足树上的所有边(a)权和与(b)权和的商最大。((1<=N,M<=1e4))
相似的问题:0/1分数规划
0/1分数规划:从长度为(n)的数列({a_n})和({b_n})中选出若干对,使得选出的(a)之和与(b)之和商最大。即求一组(x_i(1<=i<=n,x_i=0~or~1)),最大化(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i})
这个问题我们用二分答案的思想来解决。
既然是二分答案,我们首先需要选一个二分的量使答案关于它单调。
如果存在选数方案使(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i}>=mid),那么可以增大(mid);否则减小。二分停止时(mid)即为答案。
变形不等式(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i}>=mid),它等价于(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0)。
也就是说我们需要判断对于当前(mid),是否存在选数方案使(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0)。
判断是否有方案使(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0),只需要最大化(Sigma^n_{i=1} (a_i-mid*b_i)*x_i),并将其与(0)比较。而我们可以直接将所有(a_i-mid*b_i)计算出,这(n)个数中选若干产生和的最大值即为其中所有正数之和。
时间复杂度为(O(nlg n))。
回到题目
这道题与0/1规划问题唯一增加的限制就是我们选的最后那些数要在一颗树里。。。
因此在二分中,在原图结构上将每条边权修改为(a_i-b_i*mid),然后跑最大生成树,判断树上所有边权和是否非负即可。
这题实现起来比较简单也没什么细节,就不放代码了。
题外话
如果询问的是求一颗(a)权和与(b)权和乘积最小的生成树呢?
那解法显然截然不同,成了一个计算几何题了[捂脸]