[POJ2728] 最优比率生成树

题目大意:

一张\(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(n\lg n)\)

回到题目

这道题与0/1规划问题唯一增加的限制就是我们选的最后那些数要在一颗树里。。。
因此在二分中,在原图结构上将每条边权修改为\(a_i-b_i*mid\),然后跑最大生成树,判断树上所有边权和是否非负即可。

这题实现起来比较简单也没什么细节,就不放代码了。

posted @ 2020-08-04 23:15  no_proper_name_left  阅读(138)  评论(0编辑  收藏  举报