POJ 2728:Desert King(最优比率生成树)
http://poj.org/problem?id=2728
题意:有n个点,有三个属性代表每个点在平面上的位置,和它的高度。点与点之间有一个花费:两点的高度差;还有一个长度:两点的距离。现在要让你在这n个点里面弄一个生成树,使得∑cost / ∑dis 最小,问最小的比率是多少。
思路:求得的比率R = ∑(cost[i] * x[i]) / ∑(dis[i] * x[i]),x[i]为1代表选这个点,转化一下,就是要minimize(R)。
设F(L) = ∑(cost[i] * x[i]) - ∑(dis[i] * L * x[i]) = ∑(cost[i] - dis[i] * L) * x[i] = ∑D[i] * x[i] (D[i] = cost[i] - L * dis[i])。
我们要使得L越小越好,那么L越小,D[i]就会越大,因此我们要求得的是最小能达到的D[i]使得这个方程成立,这样的边界时候的L才是最小的。
那么我们可以先随便假设一个L,然后通过使用最小生成树(把上面的D[i]当做边权),判断当前的L还能够更优,当迭代到一定次数之后,就可以得出正确答案了(当然也可以二分搜索)。
具体写的很详细的:http://blog.csdn.net/hhaile/article/details/8883652
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define N 10010
const double eps = 1e-;
const double INF = ;
struct node {
double x, y, z;
} p[N];
double low[N], cost[N][N], dis[N][N];
int vis[N], pre[N], n; double sqr(double x) { return x * x; } double Prim(double k) {
double fz = , fm = , mi; int index;
for(int i = ; i <= n; i++) low[i] = cost[][i] - dis[][i] * k, vis[i] = , pre[i] = ;
vis[] = ; // 记得
for(int i = ; i < n; i++) {
mi = INF, index = -;
for(int j = ; j <= n; j++)
if(!vis[j] && mi > low[j]) mi = low[index = j];
if(index == -) break;
vis[index] = ;
fz += cost[index][pre[index]]; fm += dis[index][pre[index]];
for(int j = ; j <= n; j++)
if(!vis[j] && (cost[index][j] - dis[index][j] * k) < low[j])
low[j] = cost[index][j] - dis[index][j] * k, pre[j] = index;
}
return fz / fm;
} double solve() {
double ans = , tmp = ;
while() {
tmp = Prim(ans);
if(fabs(tmp - ans) <= eps) break;
ans = tmp;
}
return tmp;
} int main() {
while(~scanf("%d", &n), n) {
for(int i = ; i <= n; i++) scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
for(int i = ; i <= n; i++) {
for(int j = i + ; j <= n; j++) {
cost[i][j] = cost[j][i] = fabs(p[i].z - p[j].z);
dis[i][j] = dis[j][i] = sqrt(sqr(p[i].x - p[j].x) + sqr(p[i].y - p[j].y));
}
}
printf("%.3f\n", solve());
}
return ;
}
POJ 2728:Desert King(最优比率生成树)的更多相关文章
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)
题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...
- POJ 2728 Desert King(最优比率生成树, 01分数规划)
题意: 给定n个村子的坐标(x,y)和高度z, 求出修n-1条路连通所有村子, 并且让 修路花费/修路长度 最少的值 两个村子修一条路, 修路花费 = abs(高度差), 修路长度 = 欧氏距离 分析 ...
- POJ 2728 Desert King (最优比率树)
题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目 ...
- POJ 2728 Desert King (最优比例生成树)
POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小. 采用二分答案mid的思想. 将边的权值改为 wi- ...
- POJ2728 Desert King —— 最优比率生成树 二分法
题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS Memory Limit: 65536K Total Subm ...
- Desert King(最优比率生成树)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22717 Accepted: 6374 Desc ...
- 【POJ2728】Desert King 最优比率生成树
题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...
- POJ2728 Desert King 最优比率生成树
题目 http://poj.org/problem?id=2728 关键词:0/1分数规划,参数搜索,二分法,dinkelbach 参考资料:http://hi.baidu.com/zzningxp/ ...
- poj 2728 Desert King (最优比率生成树)
Desert King http://poj.org/problem?id=2728 Time Limit: 3000MS Memory Limit: 65536K Descripti ...
随机推荐
- SAAS是否能实现人在家工作的梦想?
在过去的十年,在人们的工作环境的巨大变化已经发生,越来越多的人选择在家工作. 高租金的办公室,络,快速宽带的广泛应用.这些因素都使得远程办公成为了人们工作中密不可分的一种方式.使用普通手机和办公操作系 ...
- wpf C# 操作DirectUI窗口 SendMessage+MSAA
原文:wpf C# 操作DirectUI窗口 SendMessage+MSAA 最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是D ...
- WCF学习目录
WCF 基本 WCF概念 WCF配置文件详解 多个不同类对象传输思路 WCF 大文件传输配置 Uri ? & = 毫秒数据字符串转换为DateTime POST请求——HttpWebReque ...
- jquery对象及页面加载完成写法
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- [WPF]有Focus(), 那Unfocus()呢?
原文:[WPF]有Focus(), 那Unfocus()呢? [WPF]有Focus(), 那Unfocus()呢? 周银辉 我们可以调用Focus()方法,让WPF控件获得焦点, 那我现在不想要焦点 ...
- MVVM 下 ContextMenu的命令绑定
原文:MVVM 下 ContextMenu的命令绑定 由于ContextMenu不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=" ...
- 如何将JPEG缩略图放到LISTVIEW中(delphi listview自绘图形)
http://www.docin.com/p-567657457.html?qq-pf-to=pcqq.c2c http://www.cnblogs.com/snow001x/archive/2008 ...
- 图像滤镜艺术---Wave滤镜
原文:图像滤镜艺术---Wave滤镜 Wave Filter水波滤镜 水波滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的特效.这个滤镜有一个可调参数:水波的扭曲程度. 代码如下; // ...
- Kali Linux安装TL-WN821N USB无线网卡驱动(make失败)
主要有下面几个步骤: 1.刚插上网卡,network-manager识别出来了网卡,也能搜索到WiFi,但就是连接不上.查看/var/log/syslog日志或者使用nmcli m查看网络信息,显示认 ...
- RxJava入门优秀博客推荐
RxJava用了快半年了,现在越来越离不开这个库,从使用到逐渐接触它的背后实现,突然想写点什么关于RxJava的内容.在酝酿如何组织内容的时候,就去看看自己关于RxJava的收藏,发现满满的干货! 1 ...