/*
迭代法 :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. OpenFlow_tutorial_1_Introduce

    tutorial出处:https://github.com/mininet/openflow-tutorial/wiki OpenFlow是用于远程控制交换机流表(forwarding tables) ...

  2. python3+beautifulSoup4.6抓取某网站小说(一)爬虫初探

    本次学习重点: 1.使用urllib的request进行网页请求,获取当前url整版网页内容 2.对于多级抓取,先想好抓取思路,再动手 3.BeautifulSoup获取html网页中的指定内容 4. ...

  3. scikit-learn - 分类模型的评估 (classification_report)

    使用说明 参数 sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample ...

  4. 在SpringBoot框架中使用拦截器

    1.继承WebMvcConfigureAdapter类,覆盖其addInterceptors接口,注册我们自定义的拦截器 package com.eth.wallet.config; import c ...

  5. 定义一个复数类Complex

    #include<iostream> #include<math.h> using namespace std; class Complex{ public: Complex( ...

  6. 使用HTML,CSS快速导出数据到Excel

    在应用中经常会遇到要从系统或数据库中导出数据平面文件,一般是导出到txt,csv或excel.txt和csv一般用在系统间的数据交换, 而excel一般有较好的显示效果,可以按照一定的模板导出,导出就 ...

  7. Mac 共享无线网络

    dock栏启动『设置』进入下一步.   进入设置后,点击『共享』进入下一步.   进入共享后 1.选择左边框中『互联网共享』,就会看到截图右边的样子 2.『共享以下来源链接』一项选择『以太网』(默认应 ...

  8. xtu summer individual-4 D - Martian Strings

    Martian Strings Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  9. 全文搜索(A)-相关性

    文章:搜索相关性 文章:推荐系统中相似度算法介绍及效果测试 文章:常用的相似度计算方法原理及实现 文章:推荐系统用户相似度计算方法研究

  10. hdu 1814 2-sat 输出字典最小的和任意序列的 模板题

    /* 思路:http://blog.csdn.net/string_yi/article/details/12686873 hdu 1814 输出字典序最小的2-sat */ #include< ...