【题意】每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树。

标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz……

♦01分数规划

参考Amber-胡伯涛神牛的论文《最小割模型在信息学竞赛中的应用》

°定义

分数规划(fractional programming)的一般形式:

Minimize  λ = f(x) = a(x) / b(x)   ( xS  && ∀xS, b(x) > 0 )

其中,解向量x在解空间S内, a(x)与b(x)都是连续的实值函数

分数规划的一个特例是0-1分数规划(0-1 fractional programming),就是其解向量x满足∀xi∈{0,1}(这就是所谓的0-1)。形式化定义如下:

Minimize  λ = f(x) = ax / bx = sigma(a*x) / sigma(b*x) ( x∈{0,1}^n && bx > 0 )

并且对解向量x可能还有其他的组合限制,这些针对解向量x的不同限制也就有了01分数规划的不同模型:比如最优比率生成树、最优比率生成环、最优比率割……

°解法

假设我们已经知道了最终答案λ,那么方程就可以写为: sigma(ax*) = sigma(bx*)•λ, 即sigma(ax*) - sigma(bx*)•λ = 0

令g(λ) = min(xS){ 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(xS){ (cost-λ*dist)•x }是否等于0.

而计算g(λ)就是把原图中的每条边的权值都改为cost-λ*dist,然后求最小生成树即可.

  1. #include
  2. #include
  3. //精度模板
  4. const double eps = 1e-4;
  5. bool dd(double x,double y) { return fabs( x - y ) dist[i]){
  6. minx = dist[i];
  7. u = i;
  8. }
  9. }
  10. if (u == -1) break;
  11. vis[u] = 1;
  12. csum += cost[pre[u]][u];
  13. lsum += len[pre[u]][u];
  14. for (int i = 2; i w){
  15. dist[i] = w;
  16. pre[i] = u;
  17. }
  18. }
  19. }
  20. return csum / lsum;
  21. }
  22. int main(){
  23. //freopen("test.in", "r", stdin);
  24. //freopen("test.out", "w", stdout);
  25. while(scanf("%d", &n), n){
  26. for (int i = 1; i

  27. POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)的更多相关文章

      1. POJ 2728 Desert King (01分数规划)
      1. Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Descr ...

      1. POJ 2728 Desert King 01分数规划,最优比率生成树
      1. 一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...

      1. POJ 2728 Desert King | 01分数规划
      1. 题目: http://poj.org/problem?id=2728 题解: 二分比率,然后每条边边权变成w-mid*dis,用prim跑最小生成树就行 #include<cstdio> ...

      1. poj2728 Desert King——01分数规划
      1. 题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: ...

      1. 01分数规划poj2728(最优比例生成树)
      1. Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21766   Accepted: 6087 Desc ...

      1. POJ2728Desert King - 01分数规划
      1. Description David the Great has just become the king of a desert country. To win the respect of his ...

      1. poj2728 Desert King --- 01分数规划 二分水果。。
      1. 这题数据量较大.普通的求MST是会超时的. d[i]=cost[i]-ans*dis[0][i] 据此二分. 但此题用Dinkelbach迭代更好 #include<cstdio> #in ...

      1. POJ2728Desert King(分数规划)
      1. [POJ2728]Desert King(分数规划) 题面 vjudge 翻译: \(n\)个点,每个点有一个坐标和高度 两点之间的费用是高度之差的绝对值 两点之间的距离就是欧几里得距离 求一棵生成 ...

      1. POJ 2728 Desert King(最优比率生成树 01分数规划)
      1. http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...

    1.  
    2. 随机推荐

        1. 关于Segmentation fault (core dumped)几个简单问题的整理
        1. 有的程序可以通过编译,但在运行时会出现Segment fault(段错误).这通常都是指针错误引起的.但这不像编译错误一样会提示到文件一行,而是没有任何信息.一种办法是用gdbstep, 一步一步寻 ...

        1. 【单例模式】单例模式 & GCD单例模式 & 将封装单例模式到宏
        1. 懒汉式单例模式 下面的代码块, 基本是单例模式的完整版本了. 可扩展的地方,可以在init方法中作扩展. // static 在全局变量的作用域仅限于当前文件内部 static id _instanc ...

        1. BZOJ 1189】[HNOI2007]紧急疏散evacuate
        1. Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...

        1. iOS工程中的info.plist文件
        1. 我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载 ...

        1. 1201: [HNOI2005]数三角形 - BZOJ
        1. Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n ...

        1. bootstrap-treeview
        1. 简要教程 bootstrap-treeview是一款效果非常酷的基于bootstrapjQuery多级列表树插件.该jQuery插件基于Twitter Bootstrap,以简单和优雅的方式来显示一 ...

        1. bzoj 3637: Query on a tree VI 树链剖分 && AC600
        1. 3637: Query on a tree VI Time Limit: 8 Sec  Memory Limit: 1024 MBSubmit: 206  Solved: 38[Submit][Sta ...

        1. Good Bye 2015 A
        1. Problem A:http://codeforces.com/problemset/problem/611/A A. New Year and Days 题意:某人要在2016年收集糖果,有两种不同 ...

        1. win8 优化笔记
        1. win8可以关掉的服务: 以下是小编搜集的可以安全更改为手动启动的服务(按名称排序): Application Experience(启动时为程序处理应用程序兼容性缓存请求) ·Computer Br ...

        1. oracle-number(5,2)
        1. insert into emp values(70000.123); 只能存储 整数的前3位, 小数点后面的2