Desert King
poj2728:http://poj.org/problem?id=2728
题意:给你n的点,每一个点会有一个坐标(x,y),然后还有一个z值,现在上你求一棵生成树,是的这棵生成树的所有边的费用/所有边的距离最小,其中,边费用是指两点之z差值的绝对值,边距离是指两点之间的距离。
题解:这一题就是求最小比率生成树。采用的解法就是0-1分数规划。
其中设最后的比率是l
1,z(l)是单调递减的。
2,z(max(l))=0;这可以采用反证法进行证明。
3,因为是完全图,所以要采用prime求最小生成树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=;
const double inf=10000000000.0;
double mp[N][N],cost[N][N];
double dist[N];
double xx[N],yy[N],zz[N];
int n;
bool vis[N];
bool solve(double x){
for(int i=;i<=n;i++){
vis[i]=;
dist[i]=cost[i][]-mp[i][]*x;
}
vis[]=;
dist[]=;
double cost2=;
for(int i=;i<n;i++){
double minn=inf;
int k=-;
for(int j=;j<=n;j++){
if(!vis[j]&&dist[j]<minn){
minn=dist[j];
k=j;
}
}
if(k!=-){
cost2+=dist[k];
vis[k]=;
for(int j=;j<=n;j++){
if(!vis[j]){
double tt=cost[k][j]-mp[k][j]*x;
if(dist[j]>tt){
dist[j]=tt;
}
}
}
}
}
if(cost2>=)return true;
return false; }
int main(){
while(~scanf("%d",&n)&&n){
for(int i=;i<=n;i++){
scanf("%lf%lf%lf",&xx[i],&yy[i],&zz[i]);
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
double temp=(xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]);
mp[i][j]=mp[j][i]=sqrt(temp);
cost[i][j]=cost[j][i]=abs(zz[i]-zz[j]);
}
}
double l=,r=,ans=;
while(abs(r-l)>1e-){
double mid=(r+l)/;
if(solve(mid)){
l=mid;
ans=mid;
}
else
r=mid;
}
printf("%.3f\n",ans);
}
}
Desert King的更多相关文章
- 【poj2728】Desert King
[poj2728]Desert King 题意 最优比率生成树. http://blog.csdn.net/ophunter_lcm/article/details/10113817 分析 Dinke ...
- poj 2728 Desert King (最小比例生成树)
http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- Desert King(最优比率生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22717 Accepted: 6374 Desc ...
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- POJ 2728 Desert King (01分数规划)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions:29775 Accepted: 8192 Descr ...
- poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解. Desert King Time Limit: 3000MS Memory Li ...
- poj 2728 Desert King (最优比率生成树)
Desert King http://poj.org/problem?id=2728 Time Limit: 3000MS Memory Limit: 65536K Descripti ...
- POJ2728 Desert King 【最优比率生成树】
POJ2728 Desert King Description David the Great has just become the king of a desert country. To win ...
- 【POJ2728】Desert King(分数规划)
[POJ2728]Desert King(分数规划) 题面 vjudge 翻译: 有\(n\)个点,每个点有一个坐标和高度 两点之间的费用是高度之差的绝对值 两点之间的距离就是欧几里得距离 求一棵生成 ...
- POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25310 Accepted: 7022 Desc ...
随机推荐
- Magento 中的多个类别的筛选产品集合
通过在 Magento 中的多个类别的筛选产品集合. 按只 1 类别筛选 Magento 提供筛选器,可以使用直接从该集合的类型: $_category = Mage::getModel('catal ...
- 读《编写高质量代码:改善JavaScript程序的188个建议》2
- js选中checkbox赋值给文本框
//js $(function(){ var name=""; var kmname=[]; var n= $("input[type=checkbox]"). ...
- 20160408javaweb之JDBC 大二进制和大文件存取
一.大文本存取: 我们有一本约10M的小说,现存入数据库: 代码如下:以junit测试的方式给出 package com.dzq.lob; import java.io.File; import ja ...
- 对进度条progressbar的调整
进度条的理解,感觉这个进度条不是那么简单,系统给我们定制了几个普通的,但是如果还需要有更加好的效果,需要自己去调试. <ProgressBar android:layout_width=&quo ...
- iOS 添加占位符
添加占位符: 首先占位符的大小要比textView 的大小要小一些 1.添加一个取消键盘的通知 2.添加一个代理事件 1. // removeKeyBoard 添加通知收回键盘 [[NSNotific ...
- 哥德巴赫猜想证明(C语言实现50以内的正偶数证明)
<一>哥德巴赫猜想内容: 一个充分大的偶数(大于或等于6)可以分解为两个素数之和. <二>实现要点: 要点: 判断素数(质数):除了1和本身没有其他约数. 最小的质数:2 判断 ...
- Codevs 5208 求乘方取模
5208 求乘方取模 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 未定级 题目描述 Description 给定非负整数A.B.M,求(A ^ B) mod M. 输入描述 Inpu ...
- unsigned int 转 RGB
unsigned int颜色存储格式:0xaabbggrr,其中a,b,g,r分别表示,透明度.蓝色.绿色.红色. 方法一:使用windows宏 unsigned int clr = 0x00FF00 ...
- csqlite编译相关配置问题
csqlite是非常好用的数据库,同时该数据库是开源的,基于一定原因可能需要编译自己需要的csqlite版本,那么下面介绍内容也会你就会感兴趣了. 这里要实现的目标是使用VS工具能够正确编译csqli ...