1.最优比率生成树(最优比例生成树):
定义:有向带权图G, 对于图中每条边e[i], 都有cost[i]权值)和dist[i](距离), 要求的是一棵生成树T, 它使得 ∑(cost[i]) / ∑(dist[i]), i∈T 最大(或最小).
0-1分数规划
设x[i]等于1或0, 表示边e[i]是否属于生成树.
则我们所求的比率 rate = ∑(cost[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m .

z( rate ) = ∑(cost[i] * x[i]) - rate* ∑(dist[i] * x[i])

二分法求解:在定出一个搜索范围和精度之后,可以使用二分法进行搜索:对于当前的搜索区间[left,right],mid=(left+right)/2,根据z(mid)的值及z(rate)的增减性,对搜索区间进行更新:
z(mid)>0,上调区间,使left=mid
z(mid)<0,下调区间,使right=mid
经过有限次搜索之后便能找到所求比率。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
int k;
struct node{double x,y,z;int id;
}num[maxx];
double cost[maxx][maxx];
double dis[maxx];
double d[maxx][maxx];
double w[maxx][maxx];
int vis[maxx];
int n;
double Dist(node a,node b){double x=a.x-b.x;double y=a.y-b.y;return sqrt(x*x+y*y);
}
int prim(double x){memset(vis,0,sizeof(vis));memset(dis,inf,sizeof(dis));for(int i=1;i<=n;i++){dis[i]=cost[1][i]-x*w[1][i];}dis[1]=0;vis[1]=1;double ans=0;for(int i=2;i<=n;i++){int temp=inf;int t=1;for(int j=2;j<=n;j++){if(!vis[j]&&(dis[j]<temp)){temp=dis[j];t=j;}}ans+=dis[t];vis[t]=1;for(int j=1;j<=n;j++){if(!vis[j]&&cost[t][j]-x*w[t][j]<dis[j]){dis[j]=cost[t][j]-x*w[t][j];}}}return ans>=0;
}
int main(){while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){scanf("%lf %lf %lf",&num[i].x,&num[i].y,&num[i].z);}for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){cost[j][i]=cost[i][j]=fabs(num[i].z-num[j].z);w[j][i]=w[i][j]=Dist(num[i],num[j]);}}double left=0.0,right=100.0;while(right-left>=1e-7){double mid=(left+right)/2.0;if(prim(mid)){left=mid;}else{right=mid;}}printf("%.3lf\n",right);}return 0;
}

poj2728(最优比率生成树)相关推荐

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

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

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

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

  3. POJ 2728 最优比率生成树

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

  4. wenbao与最优比率生成树

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

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

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

  6. poj 2728(最小比率生成树)

    参考题解:http://www.cppblog.com/jh818012/articles/167743.html 题意:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条 ...

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

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

  8. POJ 3621:Sightseeing Cows(最优比率环)

    http://poj.org/problem?id=3621 题意:有n个点m条有向边,每个点有一个点权val[i],边有边权w(i, j).找一个环使得Σ(val) / Σ(w)最大,并输出. 思路 ...

  9. POJ 3621 最优比率生成环

    题意:让你求出一个最优比率生成环. 思路:又是一个01分化基础题目,直接在jude的时候找出一个sigma(d[i] * x[i])大于等于0的环就行了,我是用SPFA跑最长路判断的环,这里注意一点就 ...

最新文章

  1. c c++常用算法手册(第3版_嵌入式软件开发必看书籍推荐(C/C++/linux/软件)
  2. 初入react -01
  3. OSSIM中配置网络资产监控
  4. 计算机应用类型分类 余额宝属于,按计算机应用的类型分类,余额宝属于。
  5. C/C++ 进阶 —— 指向指针的指针
  6. kinit无密码登录配置
  7. 技术文章-Java类的继承
  8. 使用Faker.NET仿造数据
  9. matlab根据直方图求均值方差_matlab求方差,均值,均方差,协方差的函数
  10. java.lang.NoClassDefFoundError: org/jaxen/JaxenException
  11. WEB前端设计师常用工具集锦
  12. pageadmin CMS网站建设教程:站点的添加和管理
  13. 近几天,被这个国家的最高科技奖刷屏了~
  14. 用Xposed框架拦截微信、人人、QQ等LBS应用的当前位置
  15. jsp是java的一种吗_jsp是什么
  16. 信息检索经典文章-1
  17. 活动推荐丨当云计算遇到边缘计算
  18. 所有身体器官的英文单词
  19. AutoCAD如何快速标注零件序号
  20. 怎么用cmd强制修改密码

热门文章

  1. Redis中哈希hash数据类型(增加修改(设置单一属性、设置多个属性)、获取(获取键所有属性、获取单一属性值、获取多个属性值)、删除、使用hash可能出现的问题)
  2. 词法,语法,句法,语义
  3. 信息工程大学806自主命题2020年回忆版真题2020年信息工程大学,初试806回忆版
  4. python 正则表达式re常用操作符 使用方法 怎么用re正则表达式表示一个IP地址:0-255
  5. 用OpenCV搭建活体检测器
  6. 机器视觉应用软件开发步骤及流程
  7. 雇佣和留住开发人员,打造优秀的团队
  8. Python3经典100例(③)
  9. php简单的log文件
  10. 程序员老司机“随意开车”,恶搞代码让你分分钟玩死程序员!