题意:

每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树。

思路:

1. sigma(cost)/sigma(dist) <= r 有 cost - r * dist <= 0

2. r = 0 当然是理想的初始状态,我们不断尝试 r 使结果不断逼近最优值,方能得到结果。

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;const int MAXN = 1010;
const double INFS = 1e15;
const double eps = 1e-5;double x[MAXN], y[MAXN], z[MAXN];
double dist[MAXN][MAXN], cost[MAXN][MAXN], map[MAXN][MAXN], d[MAXN];
int p[MAXN], n;
bool vis[MAXN];double prim(double ratio) {for (int i = 1; i <= n; i++) {map[i][i] = 0.0;for (int j = i+1; j <= n; j++)map[i][j] = map[j][i] = cost[i][j] - ratio*dist[i][j];}for (int i = 1; i <= n; i++)d[i] = map[1][i], vis[i] = false, p[i] = 1;vis[1] = true;for (int k = 1, j; k < n; k++) {double mind = INFS;for (int i = 2; i <= n; i++) if (!vis[i] && mind > d[i])mind = d[i], j = i;vis[j] = true;for (int i = 2; i <= n; i++) if (!vis[i] && d[i] > map[j][i])d[i] = map[j][i], p[i] = j;}double d1 = 0, c1 = 0;for (int i = 2; i <= n; i++) {d1 += dist[i][p[i]];c1 += cost[i][p[i]];}return c1 / d1;
}int main() {while (scanf("%d", &n) && n) {for (int i = 1; i <= n; i++)scanf("%lf%lf%lf", &x[i], &y[i], &z[i]);for (int i = 1; i <= n; i++) {dist[i][i] = cost[i][i] = 0.0;for (int j = i+1; j <= n; j++) {dist[i][j] = dist[j][i] = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));cost[i][j] = cost[j][i] = fabs(z[i] - z[j]);}}double r1 = 0.0, r2 = 0.0;while (true) {r2 = prim(r1);if (fabs(r1 - r2) < eps)break;r1 = r2;}printf("%.3lf\n", r1);}return 0;
}

转载于:https://www.cnblogs.com/kedebug/archive/2013/04/29/3050869.html

POJ 2728 Desert King(最优比率生成树)相关推荐

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

    RT 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 我想哭 凭什么!一模一样的代码一个TLE一个AC,改小二分范围和精度才过 凭什么! 我眼睁睁的看着那段代码 ...

  2. poj 2728 Desert King(最小比率生成树 / 0-1分数规划 / 二分)

    二分答案,我们要找最小的答案,如果有更小的答案说明 ∑W−Z∗∑L<=0∑W−Z∗∑L <= 0∑W−Z∗∑L<=0. #include<cstdio> #include ...

  3. POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索

    题意:给定N个三维平面点,每个点都有一个高度,每两个点之间的需要构边,边的距离由x,y坐标的欧几里得距离确定,边的花费有点的高度差即z值确定,现在问一个合理的生成树中,花费比上距离的最小值为多少? 解 ...

  4. 转载二分 01 分数规划即最大化平均值的证明0/1分数规划、最优比率生成树、最优比率环

    首页 新随笔 联系 管理 订阅 随笔- 20  文章- 0  评论- 9 [Algorithm]01分数规划--Update:2012年7月27日 [关键字] 0/1分数规划.最优比率生成树.最优比率 ...

  5. poj2728(最优比率生成树)

    1.最优比率生成树(最优比例生成树): 定义:有向带权图G, 对于图中每条边e[i], 都有cost[i]权值)和dist[i](距离), 要求的是一棵生成树T, 它使得 ∑(cost[i]) / ∑ ...

  6. [USACO]地震 (二分答案+最优比率生成树详解)

    题面:[USACO 2001 OPEN]地震 题目描述: 一场地震把约翰家的牧场摧毁了, 坚强的约翰决心重建家园. 约翰已经重建了N个牧场,现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发 ...

  7. POJ 2728 最优比率生成树

    题意:      让你求一颗最小比率生成树. 思路:      我总结过了,在这里:http://blog.csdn.net/u013761036/article/details/26666261   ...

  8. wenbao与最优比率生成树

    推荐博客 http://www.cnblogs.com/KirisameMarisa/p/4187637.html ------------------------------------------ ...

  9. POJ 3621 Sightseeing Cows [最优比率环]

    感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html 现在不也是嘛 裸题,具体看学习笔记 二分答案之后判负环就行了 $dfs$ ...

  10. 【POJ - 2728】Desert King (最有比率生成树,分数规划)

    题干: David the Great has just become the king of a desert country. To win the respect of his people, ...

最新文章

  1. Web Service未定义的解决办法
  2. 读书笔记-《大话数据结构》第二章算法
  3. 洛谷 P4245 【模板】MTT
  4. 怎么把springboot部署到阿里云_听说“一分钟就能部署阿里云ECS集群”?
  5. Android的sdk、api及工程目录说明
  6. 广告roi怎么计算公式_信息流ROI出价技巧详解及计算公式
  7. MATLAB for Mac(可视化数学分析软件)R2021b_Update_3
  8. 一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)
  9. 如何使用南方CASS绘制地形图
  10. PDF转DWG格式怎么转?分享两种好用转换方法
  11. Android NDK墓碑/崩溃分析
  12. Ubuntu 20.04 创建桌面快捷方式
  13. 下一代微型计算机,「简讯」GTX 1650完整规格曝光;任天堂推迟下一代Switch上市时间…...
  14. 计算机中电容状态表示什么,电容上面是字母代表什么
  15. 【LittleXi】sql学习笔记
  16. 个人微信小程序开发案例(附带源码以及教程,不懂后台小程序可提问)
  17. 基于java的药店管理系统
  18. H12-821题库详解(301-400)
  19. 晶体谐振器和晶体振荡器的优缺点分析
  20. 计算机软件系统一般分为什么两大部分,1、计算机软件系统一般分为( A )两大部分...

热门文章

  1. Mac效率工具:Mosaic 1.3.3
  2. 浅谈Get和Post方法的区别与TCP与UDP区别
  3. CVE-2017-4901 VMware虚拟机逃逸漏洞分析【Frida Windows实例】
  4. t_user is not mapped [from t_user as u where u.loginname = :loginname and u.password =:password]
  5. 【CentOS 7笔记26】,打包和压缩工具的使用#171108
  6. 《数据结构与算法 C语言版》—— 2.2线性表的顺序表示与实现
  7. findmnt-寻找挂载的文件系统
  8. 为什么机器学习行业的发展离不开 “开源”
  9. HTTP缓存原理及相关知识(1)
  10. (译)cocos2d精灵教程:第三部分