poj2728 Desert King --- 01分数规划 二分水果。。

这题数据量较大,普通的求MST是会超时的。

d[i]=cost[i]-ans*dis[0][i]

据此二分。

但此题用Dinkelbach迭代更好

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1010

double mp[N][N],c[N][N],x[N],y[N],z[N],e[N][N],d[N];
int vis[N],n;

inline double prim(double mid)
{
    double tmp,ans=0;
    for(int i=0;i<n;i++)
    {
        vis[i]=0;
        for(int j=0;j<i;j++)
            e[i][j]=e[j][i]=c[i][j]-mid*mp[i][j];
    }
    for(int i=1;i<n;i++)
        d[i]=e[0][i];
    d[0]=0;vis[0]=1;
    for(int i=1;i<n;i++)
    {
        int p;
        tmp=100000000;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&d[j]<tmp)
            {
                p=j;
                tmp=d[j];
            }
        }
        ans+=tmp;
        vis[p]=1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&e[j][p]<d[j])
                d[j]=e[j][p];
        }
    }
    return ans;
}

int main()
{
    int i,j;
    double le,ri,mid;
    while(scanf("%d",&n)&&n)
    {
        for(i=0;i<n;i++)
            scanf("%lf%lf%lf",&x[i],&y[i],&z[i]);
        for(i=0;i<n;i++)
            for(j=0;j<i;j++)
            {
                mp[i][j]=mp[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                c[i][j]=c[j][i]=z[i]>z[j]?z[i]-z[j]:z[j]-z[i];
            }
        le=0;ri=1001;//不开心。。这样才能水过
        while(ri-le>1e-5)
        {
            mid=(le+ri)/2.0;
         //   printf("prim:%lf\n",prim(0,mid));
            if(prim(mid)>0)
                le=mid;
            else ri=mid;
        }
        printf("%.3f\n",mid);
    }
    return 0;
}

poj2728 Desert King --- 01分数规划 二分水果。。

时间: 2024-12-04 20:40:15

poj2728 Desert King --- 01分数规划 二分水果。。的相关文章

poj2728 Desert King——01分数规划

题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define eps 1e-6 using namespace std; int const inf=0x3f3f3f;

POJ 2728 Desert King (01分数规划)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his count

POJ 2728 Desert King 0-1分数规划

题意:链接 方法: 0-1分数规划 解析: 这是之前没填的坑,现在来填坑. 这道题题意就是n个三维坐标系的点,任意两点都可以连边,每条边的花费是两点在xOy坐标系下的欧几里得距离,每条边的收益是两点的z值差的绝对值. n个点连成一棵树 求最小的花费比收益. 即求最大的收益比花费. 一看求的东西就可以考虑0-1分数规划咯? 所以二分那个L,然后每条边的get-L*cost就是每条边新的权值,因为要拿最大的n-1条,所以上MST,但是这题是n^2的边,kruscal的话是n^2logn^2*log(

$POJ$2728 $Desert\ King$ 01分数规划

正解:01分数规划 解题报告: 传送门! 感觉挺板子的,,, 因为还没做,先瞎口胡一个做法$QAQ$ 如果翻车了请当做没看见我如果错了等$get$正确做法会重新编辑的$QAQ$ 就因为有$n\leq 100$,于是如果把它联成一个完全图边数连$1e4$都没有 所以考虑直接连成一个完全图,就成了之前寒假考试题二分专题那次的$T1$辽,就直接无脑01分数规划+最大生成树就欧克 $over$? 原文地址:https://www.cnblogs.com/lqsukida/p/10827485.html

POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树. 解题思路: 对答案进行二分,当把代进去的答案拿来算最小生成树的时候,一旦总路径长度为0,就是需要的答案. 0-1规划是啥? 概念有带权图G, 对于图中每条

Desert King POJ2728(Prim+迭代+0-1分数规划)

[原题地址]: POJ2728 [题目大意]: 选 \(n-1\) 条边,最小化这些边的\[\frac{\sum w_i} {\sum d_i}\] 其中 \(w_i\) 为第 \(i\) 条边的花费,\(d_i\) 为这条边所连接的两个点的距离. \(w_i\) 为连接的两个点的 \(z\) 值差的绝对值, \(d_i\) 为欧几里得距离 [题解]: 这道题是0-1分数规划的经典题目 我们令\[\frac{\sum w_i} {\sum d_i}=k\] 这样二分 \(k\) 的值 将所有的边

51nod 1257 01分数规划/二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 1257 背包问题 V3 基准时间限制:3 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大. Input 第1行:包括2个数N, K(1 <= K <=

poj 2728 Desert King(最优比率生成树,01分数规划)

http://poj.org/problem?id=2728 大致题意:有n个村庄,输入每个村庄的位置和高度,这n个村庄要连在一起,村与村之间的长度为他们之间的欧几里得距离,花费是两村之间的高度差,要求连在一起的花费和与距离和之比的最小值. 思路:明显的最优比率生成树.二分答案λ,每条边重新赋权c[i] - λd[i] ,因为要求比值最小,那么对于所有的生成树,它们的f[λ]必须>=0,所以只需求得基于最小生成树的f'[λ],当f'[λ] = 0时即找到了正解λ*. 二分: #include <

Desert King(01分数规划问题)(最优斜率生成树)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:33847   Accepted: 9208 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his count