最优比率生成树 POJ 2728 迭代或者二分
别人解题报告的链接:
http://blog.sina.com.cn/s/blog_691190870101626q.html
说明一下关于精度的问题,当结果是精确到小数点后3为,你自然要把误差定为至少10^(-4),我定的是10^(-8)````这里多定点没事的···
然后对于POJ上的提交,如果是用C++提交,可以写printf("%.3lf\n",ans);
但是如果是用的G++提交,就得用printf("%.3f\n",ans);
当然ans定义的是double型的·····
补充的解题报告链接:
http://blog.csdn.net/sdj222555/article/details/7490797
//#define debug
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define N 1005
#define eps 1e-8
#define INF 1e300
struct point
{
int x,y,z;
} p[N];
double dis(point a,point b)
{
double t = (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return sqrt(t);
}
struct arc
{
double len,cost;
} edge[N][N];
double lowcost[N];
int pre[N];
bool vis[N];
int n;
double prim(double d)
{
double tl =,tc=,ra;
memset(vis,,sizeof(vis));
vis[] = ;
for(int i=; i<n; ++i)
{
lowcost[i] = edge[][i].cost-d*edge[][i].len;
pre[i] = ;
}
for(int k=; k<n; ++k)
{
double mi = INF;
int v;
for(int i=; i<n; ++i)
{
if(!vis[i] && lowcost[i] < mi)
{
mi = lowcost[i];
v = i;
}
}
vis[v] = ;
tc += edge[v][pre[v]].cost;
tl += edge[v][pre[v]].len;
for(int i=; i<n; ++i)
{
if(!vis[i] && lowcost[i] > edge[v][i].cost-d*edge[v][i].len)
{
lowcost[i] = edge[v][i].cost-d*edge[v][i].len;
pre[i] = v;
}
}
}
ra = tc/tl;
return ra;
}
int main()
{
#ifdef debug
freopen("in.c","r",stdin);
#endif
while(scanf("%d",&n),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=i+; j<n; ++j)
{
edge[i][j].len = edge[j][i].len = dis(p[i],p[j]);
edge[i][j].cost = edge[j][i].cost = fabs(p[i].z-p[j].z);
}
}
double r=;
while(true)
{
double t = prim(r);
if(fabs(t-r) < eps) break;
r = t;
}
printf("%.3f\n",r);
}
return ;
}
最优比率生成树 POJ 2728 迭代或者二分的更多相关文章
- POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)
题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...
- POJ 2728 Desert King(最优比率生成树 01分数规划)
http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...
- poj 2728 Desert King (最优比率生成树)
Desert King http://poj.org/problem?id=2728 Time Limit: 3000MS Memory Limit: 65536K Descripti ...
- POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
[题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...
- POJ 2728 Desert King 最优比率生成树
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20978 Accepted: 5898 [Des ...
- [转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环
01分数规划 前置技能 二分思想最短路算法一些数学脑细胞? 问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此 ...
- [POJ2728] Desert King 解题报告(最优比率生成树)
题目描述: David the Great has just become the king of a desert country. To win the respect of his people ...
- [USACO]地震 (二分答案+最优比率生成树详解)
题面:[USACO 2001 OPEN]地震 题目描述: 一场地震把约翰家的牧场摧毁了, 坚强的约翰决心重建家园. 约翰已经重建了N个牧场,现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发 ...
- 2018.09.12 earthquake(最优比率生成树)
描述 地震已经破坏了农夫约翰所有的农场以及所有连接农场的道路.作为一个意志坚强的人,他决定重建所有的农场.在重建全部N(1 <= N <= 400)个农场之前,首先必须把所有农场用道路连接 ...
随机推荐
- C++数组引用
C++数组引用 一.数组引用 C++数组的引用:引用即别名这样比指针传地址方便多了 形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是 ...
- apktool 打包解包apk的总结
1) 不需要另外下载 baksmali-2.1.2.jar, apktool.jar 好像都包含了. apktool d zhanqi.xxx.apk -o zhanqi 2) smalidea-0. ...
- 自适应界面开发总结——WPF客户端开发
1.由于界面大小是变化的,所以必须有一个稳定不变的参考界面(即在一个标准的界面尺寸下进行WPF界面开发,比如:发票查验V3.0的美工设计尺寸——1024*740): PS:在WPF的用户控件Xam ...
- English trip -- VC(情景课)3 D Reading
xu言: 感觉睡眠尽量还是要保证7+小时,才能让自己的脑袋更清醒一些... Read 阅读 My Family My name is Gloria. This is my family . This ...
- 『PyTorch』第一弹_静动态图构建if逻辑对比
对比TensorFlow和Pytorch的动静态图构建上的差异 静态图框架设计好了不能够修改,且定义静态图时需要使用新的特殊语法,这也意味着图设定时无法使用if.while.for-loop等结构,而 ...
- 『Scipy』常用方法记录
优化器使用教程 J = lambda wb: self.get_cost_grad(wb, X, Y_one_hot) theta = self.wb_init(X,Y_one_hot) result ...
- Python装饰器、生成器、内置函数、json
这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如 ...
- UVA-10118 Free Candies (DP、记忆化搜索)
题目大意:有4堆糖果,每堆有n个,有一只最多能容5个糖果的篮子.现在,要把糖果放到篮子里,如果篮子中有相同颜色的糖果,放的人就可以拿到自己的口袋.如果放的人足够聪明,问他最多能得到多少对糖果. 题目分 ...
- ShardedJedis的使用
假定有2个 redis 服务实例(A和B)在运行,在客户端进行 set 操作: set a0 xxx set a1 xxx set a2 xxx set a3 xxx 我们希望a0, a1, a2, ...
- 获取和设置消息队列的属性msgctl,删除消息队列
消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...