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,依次是 ...
随机推荐
- Android 网络图片Url 转 Bitmap
注意:该方法必须要在子线程中调用,因为涉及网络请求 public Bitmap getBitmap(String url) { Bitmap bm = null; try { URL iconUrl ...
- (转)oracle表空间使用率统计查询
转自:http://www.cnblogs.com/xwdreamer/p/3511047.html 参考文献 文献1:http://blog.itpub.net/24104518/viewspace ...
- (转)Oracle RAC日常管理命令
转自:http://www.xuebuyuan.com/1206937.html 一.查看RAC环境 RAC架构,2节点信息 节点1 SQL> show parameter instance N ...
- Android滑动到顶部悬停
无图说卵,先上图 jianshu-top.gif 查阅资料后,发现网上大部分都是用这种方法实现的: 多写一个和需要悬浮的部分一模一样的layout,先把浮动区域的可见性设置为gone.当浮动区域滑动到 ...
- 读<阿里亿级日活网关通道架构演进>有感
读<阿里亿级日活网关通道架构演进>时对优化方法有些概念不理解,特意搜索了一下,拓展自己的思路. 其中的优化: 优化方法中1,2比较常见,3,4我知道的比较少,很感兴趣.就继续追踪下去: 于 ...
- Altium Designer如何移动选中的所有对象
用shift去选中, 快捷键M S移动整体
- 从零开始使用git第一篇:下载安装配置
从零开始使用git 第一篇:下载安装配置 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:git撤销操作.分支操作和 ...
- 使用wepy开发微信小程序商城第一篇:项目初始化
使用wepy开发微信小程序商城 第一篇:项目初始化 前言: wepy小程序项目初始化的操作,官方文档看了好几遍,感觉写得不是很清楚. 这篇写得挺好的:小程序开发之wepy 1.初始化项目 (1)全局安 ...
- 9.11 Binder系统_分层
1.Binder系统过程分析,情景分析 server提供服务 (1)addService(服务名称,xxx)执行后会导致binder驱动在server的内核空间为服务创建一个binder_node结构 ...
- 18.1 IIC驱动程序(基于3.4.2内核)
驱动使用smbus提供的IIC读写函数可以参考smbus-protocol.txt文档:应用层直接使用IIC读写函数读写IIC设备,应用层读写函数是由i2c-tools这个库提供的(编译的使用和应用程 ...