这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了

1.怎么记:

首先考虑dp的状态。由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪

//dp[i][j] ==> i 是现在所在的点,j是流量

2.从哪开始

看题

3.转移方法

//dp[要去的点][现在的流量和要去的流量的最小值] = dp[现在的点][现在的流量]+去的花费

4.输出

在终点,对于每个能到达的流量,最大值就是花费/流量

dijkstra代码:

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <queue>
#include <fstream> using namespace std;
#define pp pair<long long,long long>
#define mp make_pair
long long maxi = 0, n,m, tot=0,head[100001];
struct Edge{
long long to, next,cost,flow;
}edge[100001];
void add(long long x, long long y,long long co, long long fl){
edge[tot].to = y;
edge[tot].cost = co;
edge[tot].flow = fl;
edge[tot].next = head[x];
head[x] = tot;
}
long long dp[1001][1001];
void dij(long long a, long long b){ // dijkstra
dp[a][b] = 0;
queue<pp> q;
q.push(mp(a,b));
while(!q.empty()){
long long qf = q.front().first;
long long qs = q.front().second;
q.pop();
for(long long i=head[qf];i;i=edge[i].next){
long long t = edge[i].to, flo = edge[i].flow;
if (dp[t][min(qs,flo)]>dp[qf][qs]+edge[i].cost){
dp[t][min(qs,flo)] = dp[qf][qs]+edge[i].cost; //上面讲的转移
q.push(mp(t,min(qs,flo)));
}
}
}
}
int main(){
// setIO("pump");
cin >> n >> m;
for (long long i=0;i<m;i++){
long long a,b,c,d; cin >> a >> b >> c >> d; add(a,a,c,d); add(b,b,c,d);
}
memset(dp,0x3f3f3f3f,sizeof(dp));
dij(1,1000);
for (long long i=1;i<1000;i++){
if (dp[n][i]>1e9) continue; //越界不?
long long num = floor((double)(i*1e6)/(double)dp[n][i]); // 不越界计算
maxi = max(maxi,num);
}
cout << maxi;
}

spfa:

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstring>
#include <queue>
#include <fstream> using namespace std;
#define pp pair<long long,long long>
#define mp make_pair
long long maxi = 0, n,m, tot=0,head[100001];
struct Edge{
long long to, next,cost,flow;
}edge[100001];
void add(long long x, long long y,long long co, long long fl){
edge[tot].to = y;
edge[tot].cost = co;
edge[tot].flow = fl;
edge[tot].next = head[x];
head[x] = tot;
}
bool vis[1001][1001];
long long dp[1001][1001];
void spfa(long long a, long long b){
dp[a][b] = 0;
vis[a][b] = true;
queue<pp> q;
q.push(mp(a,b));
while(!q.empty()){
long long qf = q.front().first;
long long qs = q.front().second;
vis[qf][qs] = false;
q.pop();
for(long long i=head[qf];i;i=edge[i].next){
long long t = edge[i].to, flo = edge[i].flow;
if (dp[t][min(qs,flo)]>dp[qf][qs]+edge[i].cost){
dp[t][min(qs,flo)] = dp[qf][qs]+edge[i].cost;
if (!vis[t][min(qs,flo)]) {vis[t][min(qs,flo)] = true;q.push(mp(t,min(qs,flo)));}
}
}
}
}
int main(){
// setIO("pump");
cin >> n >> m;
for (long long i=0;i<m;i++){
long long a,b,c,d; cin >> a >> b >> c >> d; add(a,a,c,d); add(b,b,c,d);
}
memset(dp,0x3f3f3f3f,sizeof(dp));
spfa(1,1000);
for (long long i=1;i<1000;i++){
if (dp[n][i]>1e9) continue;
long long num = floor((double)(i*1e6)/(double)dp[n][i]);
maxi = max(maxi,num);
}
cout << maxi;
}

题解 P5837 【[USACO19DEC]Milk Pumping】的更多相关文章

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

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

  2. P5837 [USACO19DEC]Milk Pumping G

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

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

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

  4. Milk Pumping G&Milk Routing S 题解

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

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

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

  6. Milk Pumping

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

  7. P5838 [USACO19DEC]Milk Visits G

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

  8. USACO19DEC题解

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

  9. USACO 2019 December Contest 随记

    Forewords 今年 USACO 的比赛变化挺大的,有部分分了,而且不再是固定十个点了(部分分只说这几个点满足这几个性质,以为十个点的我还高兴了一会,一提交,...),除此之外居然赛后还排名了.这 ...

随机推荐

  1. Essay写作没逻辑不要慌,掌握这几点即可

    今天文章的内容,真的是很多很多留学生的最大的问题,没有之一:逻辑.是的,你没有看错,也不用惊讶.大家的essay写作得分不高,很多时候不是因为语言问题.排除很多细节表达的不足,更让教授头疼的居然是:内 ...

  2. Node.js NPM 包(Package)

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 包是打 ...

  3. 对近期docker学习的总结

    Docker 总结 1. 说在前头(Docker命令的格式) docker中的对象分为4个(就目前我所学到的) 镜像 image 容器 container 网络 network 数据卷 volume ...

  4. [CISCN2019 华北赛区 Day1 Web5]CyberPunk

    0x00 知识点 PHP伪协议直接读取源码 http://xxx.xxx/index.php?file=php://filter/convert.base64-encode/resource=inde ...

  5. ubuntu在虚拟机下的安装 ~~~ Hadoop的安装及配置 ~~~ Hdfs中eclipse的安装

     前言 Hadoop是基于Java语言开发的,具有很好跨平台的特性.Hadoop的所要求系统环境适用于Windows,Linux,Mac系统,我们推荐选择使用Linux或Mac系统.而Linux系统则 ...

  6. 使用技巧 --- 与VS Code相关

    目的:修改VS Code的注释文本颜色 S1:假设VS Code的安装路径是 %MVSC% S2:文件资源管理器进入目录 %MVSC%\resources\app\extensions\ S3:该目录 ...

  7. HDU _2546 01背包问题

    A - 饭卡 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  8. oo第四单元及课程总结

    一.第四单元作业总结 第四单元有两次作业,第十三次作业是实现一个UML类图解析器,可以通过输入一些查询指令来查询一些类图的信息.程序的主干部分已经提供,我们的任务就是实现给出的接口,过程并不繁琐.第十 ...

  9. dbcp连接池的一些方法

    创建连接 // 简写版: Connection conn =null; Statement st =null; conn = DBCP.getConnection(); st=conn.createS ...

  10. 112.限制请求的method装饰器

    客户端与服务器之间最常用的两种请求方式: 1. GET请求一般是用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改. 2.POST请求一般是用来向服务器提交数据,会对服务器的状态 ...