POJ 2728 - 最小比例生成树
题目大意
有n个村庄,每个村庄都有一个(x, y)坐标和z海拔,定义两个村庄间的dist为坐标的距离,cost为海拔差的绝对值,求图的一颗生成树,使得\(\frac{\sum cost}{\sum dist}\)最小。
题解
最小比例生成树的裸题。
看到\(\frac{\sum cost}{\sum dist}\)的分数形式,首先可以想到分数规划:
设\(ans = \frac{\sum cost}{\sum dist}\)
则\(\sum cost - ans * \sum dist = 0\)
那么可以二分答案ans,将边的权值都变成\(cost - ans * dist\),并求最小生成树:
当ans较大时,最小生成树答案<0
当ans为最优解时,最小生成树答案=0
当ans较小时,最小生成树答案>0
code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
#define eps 1e-7
const double OO = 0x3f3f3f3f;
int n;
double ans, dist[1050][1050], len[1050][1050];
double x[1050], y[1050], z[1050], cost[1050][1050];
double minlen[1050];
bool used[1050];
inline double check(double mid){
for(int i = 1; i <= n; i++){
len[i][i] = 0;
used[i] = 0;
minlen[i] = OO;
for(int j = 1; j < i; j++)
len[i][j] = len[j][i] = cost[i][j] - dist[i][j] * mid;
}
minlen[1] = 0;
double ret = 0;
while(true){
int v = -1;
for(int i = 1; i <= n; i++)
if(!used[i] && (v == -1 || minlen[i] < minlen[v])) v = i;
if(v == -1) break;
ret += minlen[v];
used[v] = true;
for(int i = 1; i <= n; i++)
if(!used[i]) minlen[i] = min(minlen[i], len[v][i]);
}
return ret;
}
int main(){
freopen("h.in", "r", stdin);
while(scanf("%d", &n), n){
for(int i = 1; i <= n; i++){
scanf("%lf %lf %lf", &x[i], &y[i], &z[i]);
dist[i][i] = cost[i][i] = 0;
for(int j = 1; j < i; j++){
cost[i][j] = cost[j][i] = abs(z[i] - z[j]);
dist[i][j] = dist[j][i] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}
}
double l = 0, r = 1e6;
for(int i = 1; i <= 50; i++){
double mid = (l + r) / 2;
if(check(mid) < 0) r = mid;
else l = mid;
}
printf("%.3f\n", (l + r) / 2);
}
}
POJ 2728 - 最小比例生成树的更多相关文章
- poj 2728 Desert King (最小比例生成树)
http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25310 Accepted: 7022 Desc ...
- POJ 2728 Desert King 01分数规划,最优比率生成树
一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...
- POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
[题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...
- POJ 1861 ——Network——————【最小瓶颈生成树】
Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15268 Accepted: 5987 Specia ...
- bzoj2395[Balkan 2011]Timeismoney最小乘积生成树
所谓最小乘积生成树,即对于一个无向连通图的每一条边均有两个权值xi,yi,在图中找一颗生成树,使得Σxi*Σyi取最小值. 直接处理问题较为棘手,但每条边的权值可以描述为一个二元组(xi,yi),这也 ...
- HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...
- 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
[题意] n个点m条边的图 q次询问 找到一条从s到t的一条边 使所有边的最大危险系数最小 InputThere will be at most 5 cases in the input file.T ...
- 算法提高 最小方差生成树(Kruskal)_模板
算法提高 最小方差生成树 时间限制:1.0s 内存限制:256.0MB 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是 ...
随机推荐
- Mrakdonw学习
转载请注明出处:http://blog.csdn.net/cym492224103 什么是Mrakdown 为什么使用Mrakdown 怎样Mrakdown 字体 删除线 字体大小 引用 代码行代码块 ...
- 计算机系统—CPU结构和内部工作
一.计算机系统硬件组成 计算机系统的基本组成由:计算器.控制器.存储器.输入和输出设备这5大核心部件组成. 运算器和控制器等继承在一起成为CPU.以下通过这张图能够非常清楚的表达计算机系统.先从全局上 ...
- 算法中的优化问题(optimization problem)
和多数算法不同的是,有些问题的答案不只一个,而是需要在多个答案中,按照一定标准选出"最佳"答案,这类问题就统称为"优化问题"(optimization prob ...
- (笑话)切,我也是混血儿,我爸是A型血,我妈是B型血!
1.中午,在家里看电视,电视里正在说起食品安全问题.侄儿突然感叹道:“现在的食品真不让人放心啊!”嘿,没想到侄儿小小年纪竟有这般认识,我正要抓住机会教育他不要乱吃零食.这时侄儿幽怨的瞪着我说:“我昨晚 ...
- Python 极简教程(二)编码工具
Python 的编码工具很多.目前最流行的是 pycharm,关于 pycharm 的安装使用请参考 PyCharm安装使用教程. 而学习过程中,我觉得最好用的,还是 Python 自带的练习工具 I ...
- Maven学习总结(16)——深入理解maven生命周期和插件
在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的b ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
- [Node] Catch error for async await
When we try to do MongoDB opration, mongoose return Promise, we can use async/await to simply the co ...
- MVC模式编程演示样例-登录验证(静态)
好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...
- vue项目build后font-awesome不显示问题
解决办法: 修改build目录下的utils.js:添加 publicPath: '../../' // Extract CSS when that option is specified // (w ...