POJ2728 无向图中对每条边i 有两个权值wi 和vi 求一个生成树使得 (w1+w2+...wn-1)/(v1+v2+...+vn-1)最小。

采用二分答案mid的思想。

将边的权值改为 wi-vi*mid.

对所有边求和后除以v 即为 (w1+w2+...wn-1)/(v1+v2+...+vn-1)-mid. 因此,若当前生成树的权值和为0,就找到了答案。否则更改二分上下界。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int maxn=1000;
int n;
double lenth[maxn],nowans,lef,righ,w[maxn][maxn],v[maxn][maxn];
bool intree[maxn]; double ab(double x)
{
if(x>0)return x;
else return x*(-1);
} class point
{
public:
double x;double y;double z;
}; point po[maxn]; double dist(point a,point b); double cost(point a,point b)
{
return ab((a.z-b.z));
} class edge
{
public:
int pa;int pb;
double dis;double cos;double div;
edge(int a,int b,double(*distance)(point,point),double (*cost)(point,point))
{
this->pa=a;this->pb=b;
this->dis=distance(po[a],po[b]);
this->cos=cost(po[a],po[b]);
this->div=cos/dis;
}
bool operator <(const edge b)const
{
return (this->cos-(this->dis*nowans))>(b.cos-(b.dis*nowans));//这个算法的核心
}
}; double dist(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} double min(double a,double b)
{
if(a<b)return a;
else return b;
} int main()
{
ios::sync_with_stdio(false);
while(cin>>n)
{
if(n==0)return 0;
lef=0.0;righ=1e6;
for(int i=0;i<n;i++)
{
cin>>po[i].x>>po[i].y>>po[i].z;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
w[i][j]=cost(po[i],po[j]);
v[i][j]=dist(po[i],po[j]);
}
double minnow;
while(true)
{
nowans=(lef+righ)/2;minnow=0;
memset(intree,0,sizeof(intree));
for(int i=1;i<n;i++)
{
lenth[i]=w[0][i]-v[0][i]*nowans;
}
lenth[0]=0.0;intree[0]=true;
for(int i=1;i<n;i++)
{
double temp=1e+30;int tj=0;
for(int j=1;j<n;j++)
if(!intree[j]&&lenth[j]<temp)
{
tj=j;
temp=lenth[j];
}
minnow+=lenth[tj];
intree[tj]=true;
for(int j=1;j<n;j++)
{
if(!intree[j])lenth[j]=min(lenth[j],w[tj][j]-v[tj][j]*nowans);
}
}
if(ab(minnow-0.0)<1e-5)break;
if(minnow>0)lef=nowans;
else righ=nowans;
}
printf("%.3lf\n",(lef+righ)/2);
}
return 0;
}

  用二分答案思想解决的生成树问题还有单度限制最小生成树,参考CODEFORCES 125E.

POJ 2728 Desert King (最优比例生成树)的更多相关文章

  1. POJ 2728 Desert King 最优比率生成树

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20978   Accepted: 5898 [Des ...

  2. POJ.2728.Desert King(最优比率生成树 Prim 01分数规划 二分/Dinkelbach迭代)

    题目链接 \(Description\) 将n个村庄连成一棵树,村之间的距离为两村的欧几里得距离,村之间的花费为海拔z的差,求花费和与长度和的最小比值 \(Solution\) 二分,假设mid为可行 ...

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

    题意: 给定n个村子的坐标(x,y)和高度z, 求出修n-1条路连通所有村子, 并且让 修路花费/修路长度 最少的值 两个村子修一条路, 修路花费 = abs(高度差), 修路长度 = 欧氏距离 分析 ...

  4. POJ 2728 Desert King (最优比率树)

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

  5. poj 2728 Desert King (最小比例生成树)

    http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  6. POJ 2728 Desert King 01分数规划,最优比率生成树

    一个完全图,每两个点之间的cost是海拔差距的绝对值,长度是平面欧式距离, 让你找到一棵生成树,使得树边的的cost的和/距离的和,比例最小 然后就是最优比例生成树,也就是01规划裸题 看这一发:ht ...

  7. Desert King(最优比率生成树)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22717   Accepted: 6374 Desc ...

  8. POJ2728 Desert King —— 最优比率生成树 二分法

    题目链接:http://poj.org/problem?id=2728 Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Subm ...

  9. 【POJ2728】Desert King 最优比率生成树

    题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小. 题解:要求的答案可以看成是 0-1 分数规划问题 ...

随机推荐

  1. Python之面向对象新式类和经典类

    Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...

  2. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  3. Blend 混合

    Shader 中的混合 Blend Off  :不混合 Blend SrcFactor DstFactor  :SrcFactor 是源系数,DstFactor是目标系数,源系数是由片段着色器计算出来 ...

  4. java中装箱与拆箱

    转载自:https://www.cnblogs.com/dolphin0520/p/3780005.html 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若 ...

  5. 启的服务有时候突然报错:org.xml.sax.SAXParseException: schema_reference.4

    记录一下,原文地址:http://blog.csdn.net/bluishglc/article/details/7596118

  6. Django:(7)auth用户认证组件 & 中间件

    用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuper ...

  7. [网络流24题] 骑士共存(cogs 746)

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  8. 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)

    题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...

  9. jquery判断单选按钮radio是否选中的方法

    JQuery控制radio选中和不选中方法总结 一.设置选中方法 复制代码代码如下: $("input[name='名字']").get(0).checked=true; $(&q ...

  10. 欧拉 路径&&回路

    不管 欧拉回路  还是  欧拉路径  无向图或者有向图(删除方向后)要联通 欧拉路径存在的判定条件 1   无向图   度数为奇数的点最多有两个 2   有向图   最多只能有两个点的入度不等于出度  ...