/*
迭代法 :204Ms
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1100
#define eps 1e-10
#define inf 0x3fffffff
struct node {
int u,v,w;
}p[N];
double ma[N][N];
double distance(int i,int j) {
return sqrt(1.0*(p[i].u-p[j].u)*(p[i].u-p[j].u)+1.0*(p[i].v-p[j].v)*(p[i].v-p[j].v));
}
int n;
double prime(int u,double r) {
int i,j,vis[N],pre[N];
double dis[N],len=0,cost=0,total=0;
for(i=1;i<=n;i++) {
dis[i]=fabs(1.0*p[u].w-1.0*p[i].w)-ma[u][i]*r;
pre[i]=u;
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<n;i++) {
double minn=inf;
int index=-1;
for(j=1;j<=n;j++)
if(!vis[j]&&minn>dis[j]) {
minn=dis[j];
index=j;
}
if(index!=-1) {
vis[index]=1;
len+=ma[pre[index]][index];
cost=cost+fabs(1.0*p[pre[index]].w-1.0*p[index].w);
//total+=dis[index];
for(j=1;j<=n;j++) {
double f=fabs(1.0*p[index].w-1.0*p[j].w)-ma[index][j]*r;
if(!vis[j]&&f<dis[j]) {
dis[j]=f;
pre[j]=index;
}
}
}
}
// return total;
return cost/len;
}
int main() {
int i,j;
while(scanf("%d",&n),n) {
for(i=1;i<=n;i++)
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
ma[i][j]=ma[j][i]=distance(i,j);
/* double l=0.0,r=100.0;
while(r-l>eps) {
double mid=(l+r)/2;
if(prime(1,mid)>=0)l=mid;
else r=mid;
}*/
double a=0,b;
while(1) {
b=prime(1,a);
if(fabs(a-b)<eps)break;
a=b;
}
//printf("%.3f\n",r);
printf("%.3f\n",b);
}
return 0;
}
/*
二分法:1766ms
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1100
#define eps 1e-10
#define inf 0x3fffffff
struct node {
int u,v,w;
}p[N];
double ma[N][N];
double distance(int i,int j) {
return sqrt(1.0*(p[i].u-p[j].u)*(p[i].u-p[j].u)+1.0*(p[i].v-p[j].v)*(p[i].v-p[j].v));
}
int n;
double prime(int u,double r) {
int i,j,vis[N],pre[N];
double dis[N],len=0,cost=0,total=0;
for(i=1;i<=n;i++) {
dis[i]=fabs(1.0*p[u].w-1.0*p[i].w)-ma[u][i]*r;
pre[i]=u;
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<n;i++) {
double minn=inf;
int index=-1;
for(j=1;j<=n;j++)
if(!vis[j]&&minn>dis[j]) {
minn=dis[j];
index=j;
}
if(index!=-1) {
vis[index]=1;
// len+=ma[pre[index]][index];
//cost=cost+fabs(1.0*p[pre[index]].w-1.0*p[index].w);
total+=dis[index];
for(j=1;j<=n;j++) {
double f=fabs(1.0*p[index].w-1.0*p[j].w)-ma[index][j]*r;
if(!vis[j]&&f<dis[j]) {
dis[j]=f;
pre[j]=index;
}
}
}
}
return total;
// return cost/len;
}
int main() {
int i,j;
while(scanf("%d",&n),n) {
for(i=1;i<=n;i++)
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
ma[i][j]=ma[j][i]=distance(i,j);
double l=0.0,r=100.0;
while(r-l>eps) {
double mid=(l+r)/2;
if(prime(1,mid)>=0)l=mid;
else r=mid;
}
/*double a=0,b;
while(1) {
b=prime(1,a);
if(fabs(a-b)<eps)break;
a=b;
}*/
printf("%.3f\n",r);
//printf("%.3f\n",b);
}
return 0;
}

poj 2728 最优比例生成树(01分数规划)模板的更多相关文章

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

    Language: Default Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22113   A ...

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

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

  3. poj 2728 最优比率生成树

    思路:设sum(cost[i])/sum(dis[i])=r;那么要使r最小,也就是minsum(cost[i]-r*dis[i]);那么就以cost[i]-r*dis[i]为边权重新建边.当求和使得 ...

  4. POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

    用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...

  5. poj2728 最小比率生成树——01分数规划

    题目大意: 有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水, 只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差, 现在要求方案使得费用与距离的比值最小,很显然 ...

  6. POJ 2976 Dropping tests 01分数规划 模板

    Dropping tests   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6373   Accepted: 2198 ...

  7. POJ 2976 Dropping test(01分数规划模板)

    01分数划分详情可阅读:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html 题意: 给出n个a和b,让选出n-k个使得最大 二 ...

  8. POJ 2976 Dropping tests【0/1分数规划模板】

    传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...

  9. poj2728 生成树01分数规划 (二分答案)

    给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...

随机推荐

  1. Mysql基本操作、C++Mysql简单应用、PythonMysql简单应用

    MySql基本操作 -- 当指定名称的数据库不存在时创建它并且指定使用的字符集和排序方式 CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET UTF ...

  2. CAD参数绘制图案填充(网页版)

    绘制工程图,常常需要将某种图案填充到某一区域,例如剖面线的绘制.MxCAD提供了丰富的填充图案,可以利用这些图案进行快速填充. js中实现代码说明: function DrawPathToHatch2 ...

  3. Java中文乱码处理

    java编码转换过程 我们总是用一个java类文件和用户进行最直接的交互(输入.输出),这些交互内容包含的文字可能会包含中文.无论这些java类是与数据库交互,还是与前端页面交互,他们的生命周期总是这 ...

  4. JavaSE-09 继承

    学习要点 继承的优点和实现 子类重写父类方法 继承下构造方法的执行过程 抽象类和抽象方法的使用 final修饰属性.方法和类 继承的优点和实现 宠物管理系统优化设计 宠物管理系统中的类有什么问题? 使 ...

  5. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...

  6. 一键分享到QQ空间、QQ好友、新浪微博、微信代码

    通过qq空间.qq聊天.新浪微博和微信二维码分享平台提供的接口,实现把网页中对应的图片.标题.描述的信息参数用javascript获取后传进接口中,实现一键分享. 使用到的接口(测试时需要登录,网址和 ...

  7. 【memcached】memcached中flags字段的作用

    我们一般只注意到memcached的数据结构是key,value,今天看memcached源代码的时候,盯上了flags,没看明白.后来问了一下同事,说PHP当中使用flags标记,标识memcach ...

  8. JS 实现全屏预览 F11功能

    老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我?少废话,直接上代 ...

  9. AspNetPager控件的简单使用

    1.首先引用这个控件. 在前台页面上修改一些属性. <webdiyer:AspNetPager ID=" AlwaysShow="true" FirstPageTe ...

  10. 九度oj 题目1058:反序输出

    题目1058:反序输出 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9677 解决:3495 题目描述: 输入任意4个字符(如:abcd), 并按反序输出(如:dcba) 输入: 题目可 ...