poj 2728 最优比例生成树(01分数规划)模板
/*
迭代法 :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分数规划)模板的更多相关文章
- Desert King (poj 2728 最优比率生成树 0-1分数规划)
Language: Default Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22113 A ...
- POJ 2728 Desert King(最优比率生成树 01分数规划)
http://poj.org/problem?id=2728 题意: 在这么一个图中求一棵生成树,这棵树的单位长度的花费最小是多少? 思路: 最优比率生成树,也就是01分数规划,二分答案即可,题目很简 ...
- poj 2728 最优比率生成树
思路:设sum(cost[i])/sum(dis[i])=r;那么要使r最小,也就是minsum(cost[i]-r*dis[i]);那么就以cost[i]-r*dis[i]为边权重新建边.当求和使得 ...
- POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...
- poj2728 最小比率生成树——01分数规划
题目大意: 有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水, 只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差, 现在要求方案使得费用与距离的比值最小,很显然 ...
- POJ 2976 Dropping tests 01分数规划 模板
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6373 Accepted: 2198 ...
- POJ 2976 Dropping test(01分数规划模板)
01分数划分详情可阅读:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html 题意: 给出n个a和b,让选出n-k个使得最大 二 ...
- POJ 2976 Dropping tests【0/1分数规划模板】
传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...
- poj2728 生成树01分数规划 (二分答案)
给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...
随机推荐
- swift potocol 作为参量时函数的派发顺序
1.检查protocol本体是否声明调用函数: 2.如果没有,检查protocol扩展是否有该函数:如果扩展中也没有,报错: 3.如果本体声明了函数,使用动态派发机制进行派发:扩展中的实现位于最末位.
- jQuery 超过字符截取部分用星号表示
$(function(){ var str = $('#num').text(); if (str.length >15) { var strend = str.substring(4,str. ...
- cc.Button
cc.Button 1:添加按钮的方法 (1)直接创建带Button组件的节点; (2)先创建节点,再添加组件;2:按钮组件, 按钮是游戏中最常用的组件, 点击然后响应事件;3: 按钮的过渡效果: ...
- 大项目之网上书城(九)——订单Demo
目录 大项目之网上书城(九)--订单Demo 主要改动 1.OrderServiceImpl 代码 2.OrderDaoImpl 代码 3.OrderitemDaoImpl 代码 4.orderite ...
- Linux环境下验证码不显示F12报500
前言: 项目之前部署在linux系统上进行测试,今天重新部署的时候,重启了tomcat然后部署新的版本项目,结果登录页面验证码不显示,在浏览器F12页面显示的是500错误.网上查了很多方法,都没效果 ...
- [Python3网络爬虫开发实战] 3.1.3-解析链接
前面说过,urllib库里还提供了parse这个模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取.合并以及链接转换.它支持如下协议的URL处理:file.ftp.gopher.hdl.h ...
- PHP编译参数configure配置详解(持续更新中)
编译参数-使用 ./configure -h在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释 编译参数-说明 --prefix=/opt/php //指定 php 安装目录--with-a ...
- vim使用学习
1.1在正常模式下,使用h,j,k,l实现左,下,上,右移动. (如果不再正常模式下,使用Esc键进入正常模式) 1.2退出vim,先进入到正常模式,输入:q!退出,但不保存任何修改. 1.3在正常模 ...
- html css笔记 -度一
"""浏览器 shell 内核外表 内心 IE tridentFirefox Geckogoogle chrome webkit/blinksafari webkitop ...
- matplotlib多种绘图方式
目录 散点图 条形图 直方图 总结 散点图 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律? a = [1 ...