2018.09.13 poj2728Desert King(最优比率生成树)
传送门
01分数规划经典题。
不过用krsukal会T掉。
这题用prim反而更快(毕竟是完全图)
因此直接二分+最小生成树搞定。
代码:
#include<iostream>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define N 1005
using namespace std;
double x[N],y[N],z[N],w[N],cost[N][N],dis[N][N],maxn,minn=1e9;
int n;
bool vis[N];
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
inline double calc(int i,int j){return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));}
inline bool check(double mid){
double ret=0.0;
for(int i=1;i<=n;++i)w[i]=cost[1][i]-mid*dis[1][i];
memset(vis,false,sizeof(vis)),vis[1]=1;
for(int i=2;i<=n;++i){
double tmp=1e9;
int pos=0;
for(int j=1;j<=n;++j){
if(vis[j])continue;
if(tmp>w[j])tmp=w[j],pos=j;
}
ret+=tmp,vis[pos]=1;
for(int j=1;j<=n;++j){
if(vis[j])continue;
if(cost[pos][j]-mid*dis[pos][j]<w[j])w[j]=cost[pos][j]-mid*dis[pos][j];
}
}
return ret>=0.0;
}
int main(){
while(n=read()){
for(int i=1;i<=n;++i)x[i]=read(),y[i]=read(),z[i]=read();
for(int i=1;i<n;++i)
for(int j=i+1;j<=n;++j)
dis[i][j]=dis[j][i]=calc(i,j),cost[i][j]=cost[j][i]=fabs(z[i]-z[j]);
double l=0.0,r=100.0;
while(r-l>1e-6){
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
printf("%.3f\n",l);
}
return 0;
}
2018.09.13 poj2728Desert King(最优比率生成树)的更多相关文章
- 2018.09.12 earthquake(最优比率生成树)
描述 地震已经破坏了农夫约翰所有的农场以及所有连接农场的道路.作为一个意志坚强的人,他决定重建所有的农场.在重建全部N(1 <= N <= 400)个农场之前,首先必须把所有农场用道路连接 ...
- poj-2728Desert King(最优比率生成树)
David the Great has just become the king of a desert country. To win the respect of his people, he d ...
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- Desert King(最优比率生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22717 Accepted: 6374 Desc ...
- 【POJ2728】Desert King 最优比率生成树
题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...
- POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)
题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...
- POJ2728 Desert King —— 最优比率生成树 二分法
题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Subm ...
- POJ2728 Desert King 最优比率生成树
题目 http://poj.org/problem?id=2728 关键词:0/1分数规划,参数搜索,二分法,dinkelbach 参考资料:http://hi.baidu.com/zzningxp/ ...
- POJ 2728 Desert King(最优比率生成树, 01分数规划)
题意: 给定n个村子的坐标(x,y)和高度z, 求出修n-1条路连通所有村子, 并且让 修路花费/修路长度 最少的值 两个村子修一条路, 修路花费 = abs(高度差), 修路长度 = 欧氏距离 分析 ...
随机推荐
- leetcode231
public class Solution { public bool IsPowerOfTwo(int n) { )) == && n > ); } } https://lee ...
- grep命令打印前N行
想打印前5行,用head即可:grep xxx |head -n 5
- ADODB 调用存储过程
追加参数法调用存储过程 追加参数通过CreateParameter方法,用来指定属性创建新的Parameter对象.具体语法如下: Set parameter = command.CreatePara ...
- 列表(ul ol dl)
Title 1 2 3 1 2 3 a 1 2 b 1 2 <!DOCTYPE html> <html lang="en"> <head> &l ...
- remote Request
import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; ...
- python爬虫(5)--正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 1.了解正则表达式 正则表达式 ...
- C#四舍五入说明
string.Format("{0:N2}", d) 与 Math.Round(d, 2).ToString() 不总是相等 string.Format("{0:N2}& ...
- express + mongodb 搭建一个简易网站 (五)
前面已经将导航中的“所有宝贝”页面连上了mongodb,现在我们就把其他的页面脸上数据库,将整个网站全部实现. 打开routes文件,找到jacket.js,将里面的代码修改如下: var expre ...
- $(this).form("validate") 始终返回false
onsubmit 提交前触发,返回 false 来阻止提交动作. validate 进行表单字段验证,当全部字段都有效时返回 true .该方法和 validatebox 插件一起使用. 解决:注释掉 ...
- Python vars() 函数
Python vars() 函数 Python 内置函数 描述 vars() 函数返回对象object的属性和属性值的字典对象. 语法 vars() 函数语法: vars([object]) 参数 ...