poj 2728 Desert King 最优比率生成树 分数规划

2024-06-12 11:38

本文主要是介绍poj 2728 Desert King 最优比率生成树 分数规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一开始读题意可能有点难懂。

题意:

给你n个村庄的坐标点,它们都有一个海拔高度(你可以想象为三维空间)。现在让你给村庄通水,水道只能水平得建,即平行于地面。

每个水道的长度为村庄的水平距离(无视海拔高度),费用为两个村庄的海拔高度的差值。

现在只要修n-1条水道,让你求出  总费用/总长度  的最小比率。


思路:

分数规划

假设answer为最小的比率,answer <= sum(cost[i]*x[i])/sum(length[i]*x[i]),则有 sum(cost[i]*x[i]) - answer*sum(length[i]*x[i]) >= 0;

则我们就是要找出一个answer,使得对于所有的方案,都要有上面的不等式成立,并且其中至少有一个方案结果恰好等于0;


二分answer,每次把每条边的权值根据上面的式子求出来,跑最小生成树(因为是个完全图,要用prime算法)

二分范围0~100(实际上我也不知道为什么范围可以这么小。。。)

*后来我试了下Dinkelbach,二分要2000+ms,后者只需200+ms


code:

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;typedef long long LL;
const int MAXN = 1e3+5;
const double eps = 1e-9;
const double INF = 1e15;struct Village
{int x, y;int altitude;
}v[MAXN];int n;
bool vis[MAXN];
double a[MAXN][MAXN], b[MAXN][MAXN];
double w[MAXN][MAXN];
double d[MAXN];
int par[MAXN];int in()
{char ch;int val = 0;ch = getchar();while(ch < '0' || ch > '9') ch = getchar();while(ch >= '0' && ch <= '9') {val = val*10 + ch-'0'; ch = getchar();}return val;
}void input()
{for(int i = 1;i <= n; i++){v[i].x = in();v[i].y = in();v[i].altitude = in();}for(int i = 1;i <= n; i++)for(int j = i+1;j <= n; j++){a[i][j] = a[j][i] = abs(v[i].altitude-v[j].altitude);b[i][j] = b[j][i] = sqrt(1.0*(v[i].x-v[j].x)*(v[i].x-v[j].x) + 1.0*(v[i].y-v[j].y)*(v[i].y-v[j].y));}
}double Prime()
{memset(vis, false, sizeof(vis));for(int i = 1; i<=n; i++)d[i] = INF;double t1 = 0, t2 = 0;d[1] = 0;for(int i = 1;i <= n; i++){int u;double minv = INF;for(int j = 1;j <= n; j++){if(!vis[j] && d[j] < minv)u = j, minv = d[j];}if(u == -1) break;vis[u] = true;for(int j = 1;j <= n; j++){if(!vis[j] && w[u][j] < d[j]){d[j] = w[u][j];par[j] = u;}}if(u == 1) continue;t1 += a[par[u]][u];t2 += b[par[u]][u];}return t1/t2;
}double check(double mid)
{for(int i = 1;i <= n; i++)for(int j = i+1;j <= n; j++)w[j][i] = w[i][j] = a[i][j] - mid*b[i][j];return Prime();
}void solve()
{double a = 0, b;while(true){b = check(a);if(fabs(a-b) < eps) break;a = b;}printf("%.3f\n", b);
}int main()
{while(true){n = in();if(n == 0) break;input();solve();}return 0;
}




这篇关于poj 2728 Desert King 最优比率生成树 分数规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054107

相关文章

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-