描述

地震已经破坏了农夫约翰所有的农场以及所有连接农场的道路。作为一个意志坚强的人,他决定重建所有的农场。在重建全部N(1 <= N <= 400)个农场之前,首先必须把所有农场用道路连接起来,即任意两个农场之间必须有至少一条通路。

在研究了地图之后,农夫约翰已经得出了结论:M(1 <= M <= 10,000)条双向的道路可以在较短的时间内建造好。由于约翰的资金有限,他想以尽可能便宜的方法完成工程。

碰巧,农场里的奶牛们组建了一个专门从事重新改造在地震中被破坏的农场道路的工程公司,约翰决定把道路重建的工作交给奶牛们去完成。这些牛也有着锐利的商务感觉,它们希望从工程中获得最大的利益。

约翰和奶牛们经过协商,约翰愿意拿出F (1 <= F <= 2,000,000,000)元钱给奶牛们用于道路重建,要求奶牛们把所有农场用道路连接起来,即任意两个农场之间必须有至少一条通路。

奶牛们根据地图估算出了建造每条道路的成本c(1 <= c <= 2,000,000,000)及用时t(1 <= t <= 2,000,000,000),一对农场之间可以有1条以上可重建道路,并且对于给定的测试数据将所有农场连接起来是能够做到的。

现在奶牛们找到你,要求你编一个程序求出重建农场道路能让奶牛们获得的最大利润率。也就是使得剩余经费与所花时间的比值(赚钱速度)最大。

输入

输入文件包括m+1行,第一行为三个整数 N, M和 F,第二行到第M+1行,每一行都包括4个用空格隔开的整数:i, j, c,和 t分别表示可以重建的一条道路的两端连接的农场,以及重建该条道路的成本和时间。

输出

包含一个实数,表示剩余经费与所花时间的比值,保留4位小数。如果不可能以现有经费连接所有道路,输出0.0000。

样例输入

5 5 100

1 2 20 5

1 3 20 5

1 4 20 5

1 5 20 5

2 3 23 1

样例输出

1.0625

提示

样例解释 奶牛们可以选择修建最后的四条道路,这样所花经费为83,利润为17,所用时间为16,所以,他们在16单位时间内获利17元,所以比值为(100-83)/16=1.0625。

标签

USACO_2001_open_GREEN


一个简单的最优比率生成树。

要求的是F−∑c[i]∑t[i]" role="presentation" style="position: relative;">F−∑c[i]∑t[i]F−∑c[i]∑t[i]的最大值。

变了形就是F−∑(c[i]+k∗t[i])&gt;=0" role="presentation" style="position: relative;">F−∑(c[i]+k∗t[i])>=0F−∑(c[i]+k∗t[i])>=0

这个就是一个简单的01分数规划+最小生成树。

代码:

#include<bits/stdc++.h>
#define N 405
#define M 10005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,m,first[N],F,fa[N];
struct Node{int u,v,c,t;double w;}e[M];
inline bool cmp(Node a,Node b){return a.w>b.w;}
inline int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
inline bool kruskal(double mid){
    double ret=0.0;
    int cnt=0;
    for(int i=1;i<=m;++i)e[i].w=-1.0*e[i].t*mid-e[i].c*1.0;
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=n;++i)fa[i]=i;
    for(int i=1;i<=m;++i){
        if(cnt==n-1)break;
        int fx=find(e[i].u),fy=find(e[i].v);
        if(fx!=fy)fa[fx]=fy,ret+=e[i].w;
    }
    return ret+F>=0;
}
int main(){
    n=read(),m=read(),F=read();
    for(int i=1;i<=m;++i)e[i].u=read(),e[i].v=read(),e[i].c=read(),e[i].t=read();
    double l=0.0,r=60000;
    while(r-l>1e-7){
        double mid=(l+r)/2;
        if(kruskal(mid))l=mid;
        else r=mid;
    }
    printf("%.4lf",l);
    return 0;
}

2018.09.12 earthquake(最优比率生成树)的更多相关文章

  1. [POJ2728] Desert King 解题报告(最优比率生成树)

    题目描述: David the Great has just become the king of a desert country. To win the respect of his people ...

  2. POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)

    [题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...

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

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

  4. Artificial Intelligence Computing Conference(2018.09.12)

    时间:2018.09.12地点:北京国际饭店会议中心

  5. [USACO]地震 (二分答案+最优比率生成树详解)

    题面:[USACO 2001 OPEN]地震 题目描述: 一场地震把约翰家的牧场摧毁了, 坚强的约翰决心重建家园. 约翰已经重建了N个牧场,现在他希望能修建一些道路把它们连接起来.研究地形之后,约翰发 ...

  6. [转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环

    01分数规划 前置技能 二分思想最短路算法一些数学脑细胞? 问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此 ...

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

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

  8. poj 2728 Desert King (最优比率生成树)

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

  9. 最优比率生成树 poj2728

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28407   Accepted: 7863 Desc ...

随机推荐

  1. FireFox 书签 缓存 路径设置

    English ver down https://www.mozilla.org/en-US/firefox/new/ add ons https://addons.mozilla.org/en-US ...

  2. C++ 实现的netstat -an 的功能<转>-目的为获取rtmp推流地址如果是域名的话查看1935的ip

    目的可能是为了获取rtmp真正的推流ip 如果rtmp推流地址是域名,往CDN推流的话,需要nslookup  的那种DNS解析,然后获取的几个ip 可以使用netstat -n 等命令查看 1935 ...

  3. JetBrains产品永久破解

    吃水不忘挖井人,本博客转自:https://www.cnblogs.com/jyiqing/p/7699649.html 目的: 本人使用idea和webstorm进行开发,无奈正版实在是太贵了,只能 ...

  4. JAVA WEB开发中的会话跟踪

    常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. Http协议是一种无状态的协议,一旦数据交换完毕,客 ...

  5. 详述Oracle RAC的五大优势及其劣势

    不同的集群产品都有自己的特点,RAC的特点包括如下几点: ·双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户端的请求. ·高可用性.RAC是Ora ...

  6. ora-01652无法通过128(在temp表空间中)扩展temp段

    有两种错误:1.数据表空间不足 2.临时表空间不足 有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程:    既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的 ...

  7. express + mongodb 搭建一个简易网站(二)

    express + mongodb 搭建一个简易网站 (二) 在搭建网站(一)中,实现了简单的路由功能,这离一个完整的网站还差的有点远,继续撸代码吧. 1.首先在根目录下新建一个views文件夹,用来 ...

  8. urllib.parse.urldefrag(url)的解释

    引自https://www.cnblogs.com/ublue/articles/4471210.html 1.URL hash(片段标识符) 任一带#的URL称为片段URL(通常称为URL hash ...

  9. js base64转二进制

    base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...

  10. 7.Reverse Integer (INT; Overflow)

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 思路:要注意溢出 ...