P5837 [USACO19DEC]Milk Pumping G
题目描述
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的更多相关文章
- 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)
题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...
- Milk Pumping G&Milk Routing S 题解
Milk Pumping G&Milk Routing S 双倍经验时间 洛谷P5837 [USACO19DEC]Milk Pumping G 洛谷P3063 [USACO12DEC]Milk ...
- 题解 P5837 【[USACO19DEC]Milk Pumping】
这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...
- 【题解】[USACO19DEC]Milk Visits G
题目戳我 \(\text{Solution:}\) 这题不要把思想局限到线段树上--这题大意就是求路径经过的值中\(x\)的出现性问题. 最开始的想法是值域线段树--看了题解发现直接\(vector\ ...
- P5838 [USACO19DEC]Milk Visits G
发现是一道比较裸的树上莫队,于是就开始刚,然后发现好像是最难的一道题--(本题解用于作者加深算法理解,也欢迎各位的阅读) 题意 给你一棵树,树有点权,询问一条路径上是否有点权为 \(c\) 的点. 题 ...
- P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)
为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...
- Milk Pumping
今天第一次正式打个人定位赛,还是太菜,这题连枚举加最短路都没想到,显然菜是原罪. 题面: : 题解:其实方法很多,千万别浪到网络流用dinic求最大网络流求的最小费用,这题不一样.最大流/最小费用 不 ...
- USACO19DEC题解
Bronze A Cow Gymnastics 题目:https://www.luogu.com.cn/problem/P5831 题解:用数组存一下出现位置,O(n^2)枚举一下就好. 代码: #i ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
随机推荐
- Swift系列三 - 函数
函数在任何语言中都是存在的,Swift中函数更加灵活. 一.函数的定义 1.1. 有返回值(形参默认是let,也只能是let) func pi() -> Double { return 3.14 ...
- Portswigger web security academy:SQL injection
Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...
- [花式栈溢出]栈上的 partial overwrite
[花式栈溢出]栈上的 partial overwrite 希望能在这几天对Pwn中的栈上的各种利用和其他一些较小的分支做一个收尾,以便全力投入学习堆的相关知识.初步计划是对照ctf-wiki查缺补漏. ...
- Java中读取文件的几种路径配置
获取配置文件的两种方式区别 ClassLoader.getSystemClassLoader().getResourceAsStream() //ClassLoader.getSystemClassL ...
- 在Visual Studio 中使用git——文件管理-中(五)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- 将mysql数据同步到ES6.4(全量+增量)
下载安装包时注意下载到指定文件夹 这里我放在OPT文件夹下一:安装logstash进入到opt文件夹打开终端 执行以下命令wget -c https://artifacts.elastic.co/do ...
- 24.Qt Quick QML-Canvas和Context2D详解
1.Canvas介绍Canvas是一个允许绘制直线和曲线.简单和复杂的形状.图形和引用的图形图像.它还可以添加文本.颜色.阴影.渐变和图案,并执行低级别像素操作.Canvas输出可以另存为图像文件或序 ...
- 如何在我的EC2实例状态更改时获取自定义电子邮件通知
具体详情,请参见: https://amazonaws-china.com/cn/premiumsupport/knowledge-center/ec2-email-instance-state-ch ...
- WORD表格中的文字总是靠上居中不了
WORD表格中的文字总是靠上居中不了 将表格选中 然后,点击格式工具栏里的格式(第一个项目)右侧的小三角(通常显示为正文),选择清除格式,然后,再用表格与边框工具栏中的居中功能设置居中就可以了 将表格 ...
- scala :: , +:, :+ , ::: , ++ 的区别
4 种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表.用法为 x::list,其中x为加入到头部的元素,无论x是列表与否,它都只将成为新生成列表的第一个元 ...