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(最优比率生成树)的更多相关文章

  1. POJ 2728 Desert King 最优比率生成树

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20978   Accepted: 5898 [Des ...

  2. POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)

    题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...

  3. POJ 2728 Desert King(最优比率生成树, 01分数规划)

    题意: 给定n个村子的坐标(x,y)和高度z, 求出修n-1条路连通所有村子, 并且让 修路花费/修路长度 最少的值 两个村子修一条路, 修路花费 = abs(高度差), 修路长度 = 欧氏距离 分析 ...

  4. POJ 2728 Desert King (最优比率树)

    题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目 ...

  5. POJ 2728 Desert King (最优比例生成树)

    POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小. 采用二分答案mid的思想. 将边的权值改为 wi- ...

  6. POJ2728 Desert King —— 最优比率生成树 二分法

    题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Subm ...

  7. Desert King(最优比率生成树)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22717   Accepted: 6374 Desc ...

  8. 【POJ2728】Desert King 最优比率生成树

    题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...

  9. POJ2728 Desert King 最优比率生成树

    题目 http://poj.org/problem?id=2728 关键词:0/1分数规划,参数搜索,二分法,dinkelbach 参考资料:http://hi.baidu.com/zzningxp/ ...

  10. poj 2728 Desert King (最优比率生成树)

    Desert King http://poj.org/problem?id=2728 Time Limit: 3000MS   Memory Limit: 65536K       Descripti ...

随机推荐

  1. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...

  2. WPF无边框实现拖动效果

    这是在做弹幕的时候遇到的一个需求 透明背景,拖动弹幕=.= private void Window_MouseLeftButtonDown(object sender, MouseButtonEven ...

  3. 一个RPC的demo (good)

    从下面的例子中可以看到,Consumer(client)的代码中引用了Provider部分的class,本例中是 com.provider.EchoServiceImpl和com.provider.E ...

  4. Introduction To The Smart Client Software Factory (CAB/SCSF Part 18)

    1. Shell This is the start-up project for the solution. It is very similar to the start-up projects ...

  5. WPF控件的一些特殊应用

    1 checkbox.IsChecked 返回的是bool?类型,需要用bool强转,或者直接和bool类型比较,将发生隐形转换 2 RadioButton有分组属性GroupName

  6. Visual Studio 2015 和 Apache Cordova 跨平台开发入门

    原文:Visual Studio 2015 和 Apache Cordova 跨平台开发入门(一) 基于 Windows 10 的 Visual Studio 2015 跨平台的应用开发主要分为基于V ...

  7. Win8 Metro(C#)数字图像处理--2.62图像对数增强

    原文:Win8 Metro(C#)数字图像处理--2.62图像对数增强  [函数名称]   对数增强      WriteableBitmap LogenhanceProcess(Writeabl ...

  8. 赵伟国:陆资无法进入台湾紫光要到WTO控告(芯片是为了经济安全,高通找的人不是很聪明)

    集微网消息,昨天由全球半导体联盟和上海市集成电路行业协会联合举办的Memory +论坛在上海举行,会议透过来自存储器.逻辑和系统市场领先企业的高管,深入他们对未来存储器的应用.可行的商业模式,以及逻辑 ...

  9. A Summaryof JDBC

    Die Sonne gewinnen! I think it's easy to understand what is JDBC used for. Programer's program shoul ...

  10. C#整数类型

    C#支持9种整数类型,sbyte,byte,short,ushort,int,uint,long,ulong和char. 类型 含义                                  ...