题意:给n个点,可以将每个点的x,y的欧几里得距离(就是坐标系里两点距离公式)看作距离,z的差值即为费用差,求的是所有最小生成树中的min(边费用和/边距离和)。

思路:其实挑战P143有类似的列题,用的是二分枚举答案的方法,只不过不是树。这一题仅仅需要将题给图找出最小生成树,然后同样枚举即可。

虽然网上有许多高级的名词什么最优比率xxx之类的。。以及迭代的方法,不过我认为用二分也很好,易于想到也可以加深理解。

 #include <iostream>

 #include <string>

 #include <cstdio>

 #include <cstring>

 #include <cstdlib>

 #include <algorithm>

 #include <cmath>

 #define MAXN 1005

 #define INF 1000000000

 #define eps 1e-7

 using namespace std;

 int n;

 double Edge[MAXN][MAXN], lowcost[MAXN];

 int nearvex[MAXN];

 struct Point

 {

     int x, y, z;

 }p[MAXN];

 double cal(int a, int b)

 {

     return sqrt(1.0 * (p[a].x - p[b].x) * (p[a].x - p[b].x) + 1.0 * (p[a].y - p[b].y) * (p[a].y - p[b].y));

 }

 double prim(int src, double l)

 {

     double cost = , len = ;

     double sum = ;

     for(int i = ; i <= n; i++)

     {

         nearvex[i] = src;

         lowcost[i] = abs(p[src].z - p[i].z) - Edge[src][i] * l;

     }

     nearvex[src] = -;

     for(int i = ; i < n; i++)

     {

         double mi = INF;

         int v = -;

         for(int j = ; j <= n; j++)

             if(nearvex[j] != - && lowcost[j] < mi)

             {

                 v = j;

                 mi = lowcost[j];

             }

         if(v != -)

         {

             cost += abs(p[nearvex[v]].z - p[v].z);

             len += Edge[nearvex[v]][v];

             nearvex[v] = -;

             sum += lowcost[v];

             for(int j = ; j <= n; j++)

             {

                 double tmp = abs(p[v].z - p[j].z) - Edge[v][j] * l;

                 if(nearvex[j] != - && tmp < lowcost[j])

                 {

                     lowcost[j] = tmp;

                     nearvex[j] = v;

                 }

             }

         }

     }

     return sum;

 }

 int main()

 {

     while(scanf("%d", &n) != EOF && n)

     {

         for(int i = ; i <= n; i++)

             scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].z);

         for(int i = ; i <= n; i++)

             for(int j = ; j <= n; j++)

                 Edge[i][j] = cal(i, j);

         double low = , high = 10.0;             //其实二分20多次已经很足够了

         double l = 0.0, r = 100.0, mid;

         while(r - l > eps)

         {

             mid = (l + r) / ;

             if(prim(, mid) >= ) l = mid;

             else r = mid;

         }

         printf("%.3f\n", r);

     }

     return ;

 }

POJ 2728 二分+最小生成树的更多相关文章

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

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

  2. POJ - 2018 二分+单调子段和

    依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...

  3. [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)

    tree 时间限制: 3 Sec  内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...

  4. POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim

    http://172.20.6.3/Problem_Show.asp?id=1636 复习了prim,分数规划大概就是把一个求最小值或最大值的分式移项变成一个可二分求解的式子. #include< ...

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

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

  6. Desert King POJ - 2728(最优比率生产树/(二分+生成树))

    David the Great has just become the king of a desert country. To win the respect of his people, he d ...

  7. 最优比率生成树 POJ 2728 迭代或者二分

    别人解题报告的链接: http://blog.sina.com.cn/s/blog_691190870101626q.html 说明一下关于精度的问题,当结果是精确到小数点后3为,你自然要把误差定为至 ...

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

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

  9. POJ 2728 Desert King | 01分数规划

    题目: http://poj.org/problem?id=2728 题解: 二分比率,然后每条边边权变成w-mid*dis,用prim跑最小生成树就行 #include<cstdio> ...

随机推荐

  1. PowerShell创建 Profile

    profile主要用于个性化常用的函数.别名等等.每次加载powershell的时候,都会执行profile中的内容. 查看是否有profile: $profile 如果结果是false说明没有.则创 ...

  2. Java方法的多态

    方法的多态 重载.方法名相同,其他可以不同 重写.父类子类的方法名相同.访问权限不能更小 重写: 继承了父类 父类方法不能满足 子类.父类这个方法的方法名相同 参数相同 返回类型相同 访问权限不能更小 ...

  3. tensorflow实现卷积层的几种方式

    #coding:utf-8 #第一种实现 tf.nn import tensorflow as tf import tensorflow.contrib.slim as slim tf.reset_d ...

  4. Vue专题-生命周期

    有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求开发,针对这样的需求,Vue提供给我们一系列的钩子函数. 本文详细介绍了Vue实例在创建和销毁的过程中,我们 ...

  5. [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    设第i个人在t时刻生/死为(x,0/1,t),然后显然能够连上(x,0,t)->(x,0,t-1),(x,1,t)->(x,1,t+1),然后对于每个限制,用朴素的2-SAT连边即可. 但 ...

  6. 新年在家学java之基础篇--类&方法

    面向对象 面向对象OOP,面向过程POP 面向对象三大特征 封装 继承 多态 类 类由属性(对应类中的成员变量)和行为(成员方法)来构成 类的成员变量可以先声明,不用初始化,有默认值 方法名称如果多个 ...

  7. 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

    用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...

  8. rework-发出你的心声

    生意人虚张声势的时候会给人什么感觉?都是些僵硬的措辞.官方的腔调.虚伪的友善.法律术语等.你一定看过这些玩意儿,就好像是机器人写出来的东西,这些公司在向你发话,而不是和你对话. 这种专业主义面具让人觉 ...

  9. django,模板继承常用标签和规则

    一.定义基础模板 在html内容中定义多个block块,block由子模板引用同名block块,来决定是否替换这些部分{% block title %}一些内容,这里可不填{% endblock %} ...

  10. ASP.NET防止连续多次点击提交按钮 导致页面重复提交

    PS:实际使用中发现,第①种方法在火狐浏览中有时候有问题.第2种方法,在各个浏览器中都没问题 近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手 ...