POJ 2728-Desert King(01分数规划_最优比率生成树)

题目地址:POJ 2728
题意:将n个村庄连在一起,告诉每个村庄的三维坐标,村庄之间的距离为水平方向上的距离,花费为垂直方向上的高度差,求把村庄连接起来的最小的花费与长度之比为多少。
思路:最优比率生成树。和普通的01分数规划差不多的思路,只不过这道题的函数变成了一颗树而已。我是用二分查找来做的,迭代法的话请看这篇博客Fatedayt。话说二分确实慢,在最坏的上限的情况G++还是会T的。经检验貌似没有我想的那样的超级差的极限。。QAQ

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64  LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-7;
const int maxn=1010;
int n;
struct node
{
    double x,y,z;
}q[maxn];
double d[maxn];
int vis[maxn];
double dis(int i,int j,double L)
{
    return fabs(q[i].z-q[j].z)-L*sqrt((q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y));
}
double prim(double L) {
    int i,j,k,u;
    double sum=0;
    double Min;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)
    d[i]=inf;
    vis[1]=1;
    d[1]=0;
    u=1;
    for(i=2;i<=n;i++){
        Min=inf;
        k=0;
        for(j=1;j<=n;j++){
            if(vis[j]) continue;
            d[j]=min(d[j],dis(u,j,L)) ;
            if(Min>d[j]) {
                k=j;
                Min=d[j];
            }
        }
        sum+=Min;
        vis[k]=1 ;
        u=k;
    }
    return sum;
}
int main() {
    int i,j;
    double low,high,mid;
    double maxx,minn;
    while(~scanf("%d",&n)){
        if(!n) break;
        low=high=mid=0.0;
        maxx=-inf;
        minn=inf;
        for(i=1;i<=n;i++){
            scanf("%lf %lf %lf",&q[i].x,&q[i].y,&q[i].z);
                minn=min(minn,q[i].z);
                maxx=max(maxx,q[i].z);
        }
        high=maxx-minn;
        while(high-low>esp){
             mid=(low+high)/2;
            if(prim(mid)>0)
                low=mid;
            else
                high=mid;
        }
        printf("%.3f\n",low);
    }
    return 0 ;
}
【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky0429

一块也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值