[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\),然后跑最大生成树,判断树上所有边权和是否非负即可。
这题实现起来比较简单也没什么细节,就不放代码了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步