POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
【题意】每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树。
标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz……
♦01分数规划
参考Amber-胡伯涛神牛的论文《最小割模型在信息学竞赛中的应用》
°定义
分数规划(fractional programming)的一般形式:
Minimize λ = f(x) = a(x) / b(x) ( x∈S && ∀x∈S, b(x) > 0 )
其中,解向量x在解空间S内, a(x)与b(x)都是连续的实值函数。
分数规划的一个特例是0-1分数规划(0-1 fractional programming),就是其解向量x满足∀xi∈{0,1}(这就是所谓的0-1)。形式化定义如下:
Minimize λ = f(x) = a•x / b•x = sigma(a*x) / sigma(b*x) ( x∈{0,1}^n && b•x > 0 )
并且对解向量x可能还有其他的组合限制,这些针对解向量x的不同限制也就有了01分数规划的不同模型:比如最优比率生成树、最优比率生成环、最优比率割……
°解法
假设我们已经知道了最终答案λ,那么方程就可以写为: sigma(ax*) = sigma(bx*)•λ, 即sigma(ax*) - sigma(bx*)•λ = 0
令g(λ) = min(x∈S){ sigma(ax) - λ•sigma(bx) }, 易知该函数单调递减,且设*λ为该规划的最优解,则
g(λ) = 0 ⇔ λ = *λ
g(λ) > 0 ⇔ λ < *λ
g(λ) < 0 ⇔ λ > *λ
所以我们就可以二分枚举λ,然后判断g(λ)是否等于0……而g(λ)的计算要根据不同模型(即对x的不同限制)具体解决。
【Dinkelbach迭代算法】
不同于刚才的二分枚举,算法采用牛顿迭代的方式来求λ。
①初始设λ0 = 0
②计算g(λ0),并且得到最优解*x
③计算*λ = a•*x / b•*x, 如果*λ = λ0,算法结束;否则令λ0 = *λ,继续步骤②.
迭代比二分速度快很多,而且不用考虑二分的上界。
【最优比率生成树解法】
我们回到此题,就比如此题的最优比率生成树,二分枚举λ,那么就判断g(λ) = min(x∈S){ (cost-λ*dist)•x }是否等于0.
而计算g(λ)就是把原图中的每条边的权值都改为cost-λ*dist,然后求最小生成树即可.
#include
#include
//精度模板
const double eps = 1e-4;
bool dd(double x,double y) { return fabs( x - y ) dist[i]){
minx = dist[i];
u = i;
}
}
if (u == -1) break;
vis[u] = 1;
csum += cost[pre[u]][u];
lsum += len[pre[u]][u];
for (int i = 2; i w){
dist[i] = w;
pre[i] = u;
}
}
}
return csum / lsum;
}
int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
while(scanf("%d", &n), n){
for (int i = 1; iPOJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)的更多相关文章
- POJ 2728 Desert King (01分数规划)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions:29775 Accepted: 8192 Descr ...
- POJ 2728 Desert King 01分数规划,最优比率生成树
一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...
- POJ 2728 Desert King | 01分数规划
题目: http://poj.org/problem?id=2728 题解: 二分比率,然后每条边边权变成w-mid*dis,用prim跑最小生成树就行 #include<cstdio> ...
- poj2728 Desert King——01分数规划
题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: ...
- 01分数规划poj2728(最优比例生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 21766 Accepted: 6087 Desc ...
- 【POJ2728】Desert King - 01分数规划
Description David the Great has just become the king of a desert country. To win the respect of his ...
- poj2728 Desert King --- 01分数规划 二分水果。。
这题数据量较大.普通的求MST是会超时的. d[i]=cost[i]-ans*dis[0][i] 据此二分. 但此题用Dinkelbach迭代更好 #include<cstdio> #in ...
- 【POJ2728】Desert King(分数规划)
[POJ2728]Desert King(分数规划) 题面 vjudge 翻译: 有\(n\)个点,每个点有一个坐标和高度 两点之间的费用是高度之差的绝对值 两点之间的距离就是欧几里得距离 求一棵生成 ...
- POJ 2728 Desert King(最优比率生成树 01分数规划)
http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...
随机推荐
- iphone开发第二个程序
此程序包括UIProgressView,UIButton, UIDatePicker,UIAlert,UILabel,NSTimer // // HViewController.h // Btn_ ...
- ofbiz进阶之框架配置文件指导
The Open For Business Project: Framework Configuration Guide 原文链接:http://ofbiz.apache.org/docs/corec ...
- X86 复制本地 生成有问题、类型初始值设定项引发异常
一. 选择项目,右击属性——生成——目标平台 选择x86就可以了. 二. 有的时候你发现你项目中的dll没有生成到本地bin,这时右击它属性,到它引用的地方复制引用dll放到部署环境中,你会发现一样报 ...
- asp.net mvc Ajax.BeginForm不能异步刷新,或转到新页面,或页面还是刷新了,的原因(或解决办法)(转)
昨天搞了一下午的Ajax.BeginForm都没能实现异步刷新,一直将返回的数据提交到新的页面,在网上搜了n多方法都不行,问了n多人都没能搞定,今天大一早,就意外的被我发现了问题所在. 布局页: &l ...
- Spring Aop实例之xml配置
AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; pu ...
- Python拷贝及多进程与类的问题
最近写python写的尤其不顺利,更多的debug,逐渐的深入,产出却比较少.应该是个瓶颈期,坚持坚持,厚着脸皮也要坚持下去. 0x00 拷贝问题 程序中涉及到多进程和协程,大致的模型是开了2+个进程 ...
- 【bzoj3110】[Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- javascript面向对象思想2
上篇说到面向对象可以帮我们梳理页面的逻辑的文章(http://www.cnblogs.com/hetaojs/p/6024013.html),很多朋友看了说我这种写法是初级的面向对象小儿科,确实是初级 ...
- 1021: [SHOI2008]Debt 循环的债务 - BZOJ
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...
- 深入js的面向对象学习篇——温故知新(一)
在学习设计模式前必须要知道和掌握的***. 为类添加新方法: Function.prototype.method = function(name,fn) { this.prototype[name] ...