题目描述

Farmer John 最近为了扩张他的牛奶产业帝国而收购了一个新的农场。这一新的农场通过一个管道网络与附近的小镇相连,FJ 想要找出其中最合适的一组管道,将其购买并用来将牛奶从农场输送到小镇。

这个管道网络可以用 $N$ 个接合点(管道的端点)来描述,将其编号为 $1…N$。接合点 $1$ 表示 FJ 的农场,接合点 $N$ 表示小镇。有 $M$ 条双向的管道,每条连接了两个接合点。使用第 $i$ 条管道需要 FJ 花费 $c_i$​ 美元购入,可以支持每秒 $f_i$​ 升牛奶的流量。

FJ 想要购买一条管道组成一条单一路径,路径的两端点分别为接合点 $1$ 和 $N$。这条路径的花费等于路径上所有管道的费用之和。路径上的流量等于路径上所有管道的最小流量(因为这是沿这条路径输送牛奶的瓶颈)。FJ 想要最大化路径流量与路径花费之比。保证存在从 $1$ 到 $N$之间的路径。

输入格式

输入的第一行包含 $N$ 和 $M$。以下 $M$ 行每行以四个整数描述一条管道:$a$ 和 $b$(管道连接的两个不同的接合点),$c$(管道的花费),以及 $f$(管道的流量)。花费和流量均为范围 $1…1000$ 之内的正整数。

输出格式

输出 $10^6$ 乘以最优解的值,并向下取整(也就是说,如果这个数本身不是整数,输出小于它的最接近它的整数)。

样例数据

输入

3 2
2 1 2 4
2 3 5 3

输出

428571

分析

给定一个无向图,每条边有其代价 $c$ 和限制 $f$。求出一条从 $1$ 到 $n$ 的路径,使得$\frac{min\left \{Flow_i\right \}}{\sum c_i}$ 最大。

即以$c$为边权跑最短路,用$Dijkstra$或$SPFA$均可,为了达到枚举 $f$ 起的限制作用,我们在每次松弛操作之前,要先判断这条边的限制是否大于 $f$。否则不把这条边计算的最短路中,因为它不满足当前限制。

代码

#include <bits/stdc++.h>

#define Enter puts("")
#define Space putchar(' ')
#define MAXN 2000100
#define INF 1e6 using namespace std; typedef long long ll;
typedef double Db; inline ll Read()
{
ll Ans = 0;
char Ch = getchar() , Las = ' ';
while(!isdigit(Ch))
{
Las = Ch;
Ch = getchar();
}
while(isdigit(Ch))
{
Ans = (Ans << 3) + (Ans << 1) + Ch - '0';
Ch = getchar();
}
if(Las == '-')
Ans = -Ans;
return Ans;
} inline void Write(ll x)
{
if(x < 0)
{
x = -x;
putchar('-');
}
if(x >= 10)
Write(x / 10);
putchar(x % 10 + '0');
} struct Edge
{
int Dis , To , Next , Flow;
}E[MAXN]; int Head[MAXN] , Dis[MAXN] , Count;
bool Visit[MAXN];
int n , m;
int MAX; inline void Add_Edge(int u , int v , int d , int Flow)
{
E[++Count].Dis = d;
E[Count].To = v;
E[Count].Next = Head[u];
E[Count].Flow = Flow;
Head[u] = Count;
} struct Node
{
int Dis , Position;
bool operator < (const Node &x) const
{
return x.Dis < Dis;
}
Node(int Dis , int Position):Dis(Dis) , Position(Position){}
}; priority_queue <Node> Q; inline void Dijkstra()
{
for(int x = 1; x <= 1000; x++)
{
for(int j = 1; j <= n; j++)
{
Dis[j] = INF;
Visit[j] = false;
}
Dis[1] = 0;
Q.push(Node(0 , 1));
while(!Q.empty())
{
Node Temp = Q.top();
Q.pop();
int u = Temp.Position;
if(Visit[u])
continue;
Visit[u] = true;
for(int i = Head[u]; i; i = E[i].Next)
{
if(E[i].Flow < x)
continue;
int v = E[i].To;
if(Dis[u] + E[i].Dis < Dis[v])
{
Dis[v] = Dis[u] + E[i].Dis;
if(!Visit[v])
Q.push(Node(Dis[v] , v));
}
}
}
if(Dis[n] != INF)
MAX = max(MAX , x * 1000000 / Dis[n]);
}
} int main()
{
n = Read() , m = Read();
for(int i = 1; i <= m ; i++)
{
int u = Read() , v = Read() , d = Read() , Flow = Read();
Add_Edge(u , v , d , Flow);
Add_Edge(v , u , d , Flow);
}
Dijkstra();
Write(MAX);
return 0;
}

P5837 [USACO19DEC]Milk Pumping G的更多相关文章

  1. 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)

    题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...

  2. Milk Pumping G&Milk Routing S 题解

    Milk Pumping G&Milk Routing S 双倍经验时间 洛谷P5837 [USACO19DEC]Milk Pumping G 洛谷P3063 [USACO12DEC]Milk ...

  3. 题解 P5837 【[USACO19DEC]Milk Pumping】

    这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...

  4. 【题解】[USACO19DEC]Milk Visits G

    题目戳我 \(\text{Solution:}\) 这题不要把思想局限到线段树上--这题大意就是求路径经过的值中\(x\)的出现性问题. 最开始的想法是值域线段树--看了题解发现直接\(vector\ ...

  5. P5838 [USACO19DEC]Milk Visits G

    发现是一道比较裸的树上莫队,于是就开始刚,然后发现好像是最难的一道题--(本题解用于作者加深算法理解,也欢迎各位的阅读) 题意 给你一棵树,树有点权,询问一条路径上是否有点权为 \(c\) 的点. 题 ...

  6. P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)

    为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...

  7. Milk Pumping

    今天第一次正式打个人定位赛,还是太菜,这题连枚举加最短路都没想到,显然菜是原罪. 题面: : 题解:其实方法很多,千万别浪到网络流用dinic求最大网络流求的最小费用,这题不一样.最大流/最小费用 不 ...

  8. USACO19DEC题解

    Bronze A Cow Gymnastics 题目:https://www.luogu.com.cn/problem/P5831 题解:用数组存一下出现位置,O(n^2)枚举一下就好. 代码: #i ...

  9. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

随机推荐

  1. C#-自动获取IP

    //自动获取ip rip是个下拉列表 public void GetIp() { try { string strHostName = Dns.GetHostName(); //得到本机的主机名 IP ...

  2. [CTF]维吉尼亚密码(维基利亚密码)

    [CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...

  3. layui中的多图上传

    效果展示: 1.html部分: 注:<input> 作为隐藏域,用于保存多图上传的资源数组,方便后期进行 form 表单的提交 <input type="hidden&qu ...

  4. 11.qml-通过方法来加载组件、字符串方式加载组件

    在上章,我们学习了10.qml-组件.Loader.Component介绍. 本章我们继续来学习组件的其它创建方式. 1.调用Function来加载和移除组件 之前我们是使用Loader对象来实现加载 ...

  5. Markdown编辑器怎么用

    Markdown编辑器怎么用 1.代码块 快速创建一个代码块 // 语法: // ```+语言名称,如```java,```c++ 2.标题 语法:#+空格+标题名字,一个#表示一级标题,两个#表示二 ...

  6. Python 基础教程 —— Pandas 库常用方法实例说明

    目录 1. 常用方法 pandas.Series 2. pandas.DataFrame ([data],[index])   根据行建立数据 3. pandas.DataFrame ({dic})  ...

  7. 简单对比vue2.x与vue3.x响应式及新功能

    简单对比vue2.x与vue3.x响应式 对响应方式来讲:Vue3.x 将使用Proxy ,取代Vue2.x 版本的 Object.defineProperty. 为何要将Object.defineP ...

  8. [DB] ElasticSearch

    安装 root用户解压,修改配置文件 创建新用户es 修改文件权限:chown -R es:es /kkb/install/elasticsearch-6.7.0/ 用es用户启动ElasticSea ...

  9. 用JIRA管理你的项目——(三)基于LDAP用户管理

    JIRA提供了基于LDAP方式的用户管理,也就是用户密码的管理交给LDAP,而JIRA只管理用户在系统中的角色. 要打开JIRA的LDAP设置,首先需要验证下你的LDAP服务是否正常! 几乎有所有的L ...

  10. 面试阿里P6难在哪?(面试难点)

    对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿 ...