/*
迭代法 :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. 数据库系统概论(1)——Chap. 1 Introduction

    数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...

  2. jquery 点击切换div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Flask框架 之模版

    一.过滤器 safe:禁用转义: <p>{{ '<em>hello</em>' | safe }}</p> capitalize:把变量值的首字母转成大 ...

  4. cookie和session的用法用途,执行流程,区别联系

    1.为什么要有cookie/session?在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束).那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁.比如w ...

  5. vue小结1

    (1)渐进式vue 构建用户界面的渐进式框架 只关注视图层 (2)vue中的两个核心点 响应的数据绑定:当数据发生改变时,自动更新视图 利用Object.definedProperty(该属性IE8不 ...

  6. git 提交运用vim编辑器

    git  commit -m 默认使用nano,觉得不爽,改成vim吧.在 .gitconfig (在根目录下)的  [core] 段中加上 editor=vim . 或:$git config -- ...

  7. url编码函数encodeURI和encodeURIComponent

    var url = "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url)  //" ...

  8. Parker Gear Pump - Gear Pump Seal Is More O-Ring: Role

    Parker Gear Pump    introduction Gear pump lip seal is mainly used in reciprocating dynamic seals. C ...

  9. 「 Luogu P2657 」 windy数

    # 题目大意 给出区间 $[a,b]$,求出区间中有多少数满足下列两个条件 不含有前导 $0$. 相邻两个数字之差的绝对值至少是 $2$. # 解题思路 数位 $DP$,用记忆化搜索来实现.设 $dp ...

  10. nodejs学习(一) ---- nodejs + express应用生成器 快速创建应用

    1.node安装及环境配置(自行百度) 2.express安装及配置 (自行百度) 3.通过应用生成器工具 express 快速创建应用骨架   全局安装应用生成器 : npm install exp ...