题目链接:http://poj.org/problem?id=2728

题目:

题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差。

思路:

  由上图我们可以得知,我们只需对x进行二分(最大化平均值),以cost[i]-len[i]*x为边权跑prime即可。

代码实现如下:

  1. #include <set>
  2. #include <map>
  3. #include <queue>
  4. #include <stack>
  5. #include <cmath>
  6. #include <bitset>
  7. #include <cstdio>
  8. #include <string>
  9. #include <vector>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <iostream>
  13. #include <algorithm>
  14. using namespace std;
  15.  
  16. typedef long long ll;
  17. typedef pair<ll, ll> pll;
  18. typedef pair<ll, int> pli;
  19. typedef pair<int, ll> pil;;
  20. typedef pair<int, int> pii;
  21. typedef unsigned long long ull;
  22.  
  23. #define lson i<<1
  24. #define rson i<<1|1
  25. #define bug printf("*********\n");
  26. #define FIN freopen("D://code//in.txt", "r", stdin);
  27. #define debug(x) cout<<"["<<x<<"]" <<endl;
  28. #define IO ios::sync_with_stdio(false),cin.tie(0);
  29.  
  30. const double eps = 1e-;
  31. const int mod = ;
  32. const int maxn = + ;
  33. const double pi = acos(-);
  34. const int inf = 0x3f3f3f3f;
  35. const ll INF = 0x3f3f3f3f3f3f3f;
  36.  
  37. int n, x, y, z;
  38. double ans;
  39. int vis[maxn];
  40. double mp[maxn][maxn], dis[maxn];
  41.  
  42. struct node {
  43. int x, y ,z;
  44. }p[maxn];
  45.  
  46. double dist(node& a, node& b) {
  47. return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
  48. }
  49.  
  50. bool prime(double x) {
  51. for(int i = ; i <= n; i++) {
  52. dis[i] = inf;
  53. vis[i] = ;
  54. }
  55. ans = ;
  56. dis[] = ;
  57. for(int i = ; ; i++) {
  58. double mx = inf;
  59. int t = -;
  60. for(int j = ; j <= n; j++) {
  61. if(!vis[j] & mx > dis[j]) {
  62. mx = dis[j];
  63. t = j;
  64. }
  65. }
  66. if(t == -) break;
  67. ans += mx;
  68. vis[t] = ;
  69. for(int j = ; j <= n; j++) {
  70. if(!vis[j] && dis[j] > fabs(p[t].z - p[j].z) - mp[t][j] * x) {
  71. dis[j] = fabs(p[t].z - p[j].z) - mp[t][j] * x;
  72. }
  73. }
  74. }
  75. return ans >= ;
  76. }
  77.  
  78. int main() {
  79. //FIN;
  80. while(~scanf("%d", &n) && n) {
  81. for(int i = ; i <= n; i++) {
  82. scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].z);
  83. }
  84. for(int i = ; i <= n; i++) {
  85. for(int j = ; j <= n; j++) {
  86. mp[i][j] = dist(p[i], p[j]);
  87. }
  88. }
  89. double ub = , lb = , mid;
  90. while(ub - lb > eps) {
  91. mid = (ub + lb) / ;
  92. if(prime(mid)) lb = mid;
  93. else ub = mid;
  94. }
  95. printf("%.3f\n", lb);
  96. }
  97. return ;
  98. }

Desert King(POJ2728+最优比率生成树+二分)的更多相关文章

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

    POJ2728 Desert King Description David the Great has just become the king of a desert country. To win ...

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

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

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

    http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...

  4. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  5. POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25310   Accepted: 7022 Desc ...

  6. POJ 2728:Desert King(最优比率生成树)

    http://poj.org/problem?id=2728 题意:有n个点,有三个属性代表每个点在平面上的位置,和它的高度.点与点之间有一个花费:两点的高度差:还有一个长度:两点的距离.现在要让你在 ...

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

    题目链接:http://poj.org/problem?id=2728 题意: 给你n个点(x,y,z),让你求一棵生成树,使得 k = ∑ |z[i]-z[j]| / ∑ dis(i,j)最小. | ...

  8. 2018.09.13 poj2728Desert King(最优比率生成树)

    传送门 01分数规划经典题. 不过用krsukal会T掉. 这题用prim反而更快(毕竟是完全图) 因此直接二分+最小生成树搞定. 代码: #include<iostream> #incl ...

  9. poj 2728 Desert King(最优比例生成树)

    #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #i ...

随机推荐

  1. 网众远程修改ip、dns

    修改文件 修改ip vi /etc/rc.d/rc.inetd1.config IPADDR[0] 对应第一块网卡的ip 修改dns vi /etc/resolv.conf nameserver 21 ...

  2. .NET中SQL Server数据库连接方法

    1. 使用本机上的SQL Server Express 实例上的用户实例.       用户实例的连接创建了一个新的SQL Server 实例.此连接只能是在本地SQL Server 2005实例上并 ...

  3. 【Python】python之set

    阅读目录 一.set集合介绍 二.集合的方法 1.s.add()添加元素 3.s.copy()浅拷贝 4.s.difference(b) 5.s.difference_update(b) 6.s.di ...

  4. BZOJ 1037 生日聚会(神DP)

    这题的DP很难想,定义dp[i][j][a][b]表示用了i个男生,j个女生,任一连续的后缀区间内,男生比女生最多多a人,女生比男生最多多b人. 转移就是显然了. # include <cstd ...

  5. openstack之neutron

    Neutron neutron主要就是用于网络虚拟化,之前将nova的时候说过,网络部分没有写,因为openstack中的网络属于一个大部分,所以今天咱们就来看看neutron到底是怎么样实现网络虚拟 ...

  6. C# 跨服务大文件复制

    跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...

  7. [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]

    题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...

  8. POJ3090:Visible Lattice Points——题解

    http://poj.org/problem?id=3090 题目大意:你站在(0,0)的点上看向第一向限的点,点和点会互相阻挡,问最多看到多少点. 很容易想到,我们能看到的点,它的横纵坐标一定是互质 ...

  9. git生成ssh key和多账号支持

    git配置ssh 1.首先设置git的全局user name和email $ git config --global user.name "ygtzz"$ git config - ...

  10. bzoj3810: [Coci2015]Stanovi(记忆化搜索)

    实际上切出来的矩阵在原矩阵上的位置是不重要的...重要的只有矩阵的大小和上下左右是否在边界上. 于是我们可以设f[x][y][l][r][u][d]表示x*y的矩阵上下左右是不是边界的最小代价. 记忆 ...