【poj2728】Desert King

题意

最优比率生成树。

http://blog.csdn.net/ophunter_lcm/article/details/10113817

分析

Dinkelbach算法,通过迭代的思想进行参数搜索。

每一次的参数搜索,求出来的最小生成树又会生成一个更优的参数,然后用新的参数继续搜...以此类推。

为什么生成的参数会更优?

这是因为我们要最小化\(\sum C\over \sum D\),我们设答案为\({\sum C\over \sum D}<L\),这等价于\(\sum(C-DL)<0\)

我们满足以上等式,就是说明存在\(C,D\)满足\(\sum(C-DL)<0\),所以逆推回来就有\(L>{\sum C\over \sum D}\),且\(\sum C\over \sum D\)是可取的,所以就进一步的逼近了。

可以证明逼近最优解的次数为\(O(\log NC)\),即是一个\(\log\)级别的次数。

所以可以大胆地去用。

它跑得一般比二分还快。

但是适用的范围没有二分广。

总之具体问题具体分析。

为什么我的姿势这么挫,跑得这么慢...

#include <cstdio>
#include <cstring>
#include <cctype>
#include <climits>
#include <cmath>
#include <algorithm>
using namespace std;

#define rep(i,a,b) for (int i=(a);i<=(b);i++)

const int N=1024;

const int INF=INT_MAX;

const double MAX=1e10;
const double EPS=1e-4;

int n;
double x[N],y[N],z[N];

double d[N][N];
double h[N][N];

double ans;
double mp[N][N];
int vis[N]; double dis[N]; int src[N];
double sumD,sumH;

inline int cmp(double a,double b)
{
    if (fabs(a-b)<EPS) return 0;
    return a<b?-1:1;
}

inline double GetDis(double xi,double yi,double xj,double yj)
{
    double dx=xi-xj,dy=yi-yj;
    return sqrt(pow(dx,2)+pow(dy,2));
}

double Prim(void)
{
    double sum=0;

    memset(mp,0,sizeof mp);
    memset(vis,0,sizeof vis); memset(dis,0,sizeof dis); memset(src,0,sizeof src);
    sumD=sumH=0;

    rep(i,1,n) rep(j,1,n)
        mp[i][j]=h[i][j]-ans*d[i][j];
    vis[1]=1; dis[1]=0; rep(i,2,n) dis[i]=mp[1][i],src[i]=1;

    rep(tms,1,n-1)
    {
        double t=MAX; int frm=0,to=0;
        rep(i,1,n) if (!vis[i])
            if (dis[i]<t) t=dis[i],frm=src[i],to=i;

        vis[to]=1;
        sumD+=d[frm][to],sumH+=h[frm][to];
        sum+=t;

        rep(i,1,n) if (!vis[i])
            if (mp[to][i]<dis[i]) dis[i]=mp[to][i],src[i]=to;
    }

    return sum;
}

int main(void)
{
    #ifndef ONLINE_JUDGE
    freopen("poj2728.in","r",stdin);
    freopen("poj2728.out","w",stdout);
    #endif

    rep(tms,1,INF)
    {
        scanf("%d",&n); if (!n) break;
        memset(x,0,sizeof x); memset(y,0,sizeof y); memset(z,0,sizeof z);
        rep(i,1,n) scanf("%lf%lf%lf",x+i,y+i,z+i);

        memset(d,0,sizeof d); memset(h,0,sizeof h);
        rep(i,1,n) rep(j,1,n)
        {
            d[i][j]=GetDis(x[i],y[i],x[j],y[j]);
            h[i][j]=fabs(z[i]-z[j]);
        }

        ans=MAX;
        while (1)
        {
            double t=Prim();
            if (cmp(t,0)!=0)
                ans=sumH/sumD;
            else break;
        }
        printf("%0.3lf\n",ans);
    }

    return 0;
}

【poj2728】Desert King的更多相关文章

  1. 【POJ2728】Desert King(分数规划)

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

  2. 【POJ2728】Desert King - 01分数规划

    Description David the Great has just become the king of a desert country. To win the respect of his ...

  3. 【POJ2728】Desert King 最优比率生成树

    题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...

  4. 【POJ 2728 Desert King】

    Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 27109Accepted: 7527 Description David the ...

  5. 【HDOJ】【1512】Monkey King

    数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...

  6. POJ2728:Desert King——题解

    http://poj.org/problem?id=2728 题目大意:求一棵生成树使得路费用和/路长之和最小(路的费用是两端点的高度差) 最小比率生成树. 我们还是01分数规划的思想将边权变为路费用 ...

  7. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  8. POJ2728 Desert King 【最优比率生成树】

    POJ2728 Desert King Description David the Great has just become the king of a desert country. To win ...

  9. 【BZOJ】1087: [SCOI2005]互不侵犯King

    [算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...

随机推荐

  1. IIS与Apache共用80端口方法[试用成功]

    然后假设apache服务器已经安装完成,打开httpd.conf配置文件,找到这些地方去掉#开启代理模块: LoadModule proxy_module modules/mod_proxy.so L ...

  2. 使用cookie保存页面登录信息

    1.数据库连接配置页面:connectvars.php <?php//数据库的位置define('DB_HOST', 'localhost');//用户名define('DB_USER', 'r ...

  3. dg_MeetingRoom 居中显示

    标题栏 居中 DataGridViewCellStyle headerStyle = new DataGridViewCellStyle(); //dg_MeetingRoom 头居中样式 heade ...

  4. 关于myeclipse中maven项目转换相关设置

    关于myeclipse中maven项目转换相关设置 在myeclipse菜单中,Configure->Convert to Maven Project 这个菜单 如果没有的话,需要做如下设置: ...

  5. Struts2的标签库(五)——表单标签

    Struts2的标签库(五) --表单标签 几个特殊的表单标签的使用: 1.checkboxlist标签 该标签用于创建多个复选框,用于同时生成多个<input type="check ...

  6. STREAM Benchmark

    STREAM Benchmark及其操作性能分析 文/raywill STREAM 是业界广为流行的综合性内存带宽实际性能 测量 工具之一.随着处理器处理核心数量的增多,内存带宽对于提升整个系统性能越 ...

  7. Cheatsheet: 2014 02.01 ~ 02.28

    Database Managing disk space in MongoDB When to use GridFS on MongoDB .NET The Past, Present, and Fu ...

  8. uva 10065 (凸包+求面积)

    链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...

  9. STORM_0006_第二个storm_topology:WordCountTopology的代码与运行

    我先试试这个Open Live Writer能不能用. 再在ScribeFire中修改一下已经发布的文章试试看. 这两个写博客的地方都没有原始的编辑器方便,可以插入代码,选择文章的分类.所以以后还有这 ...

  10. 详解 ASP.NET异步

    在前文中,介绍了.NET下的多种异步的形式,在WEB程序中,天生就是多线程的,因此使用异步应该更为谨慎.本文将着重展开ASP.NET中的异步. [注意]本文中提到的异步指的是服务器端异步,而非客户端异 ...