这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用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. JAVA - SpringBoot项目跨域访问

    JAVA - SpringBoot添加支持CORS跨域访问 CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Aja ...

  2. JAVA中的指针

    不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...

  3. 第九篇 AJAX

    AJAX 阅读目录(Content) 概述 AJAX常见应用情景 AJAX的优缺点 jQuery实现的AJAX $.ajax参数 AJAX请求如何设置csrf_token 序列化 Django内置的s ...

  4. 小程序实现textarea行数自动增加

    查找网上案例很多,但是都不是很满意,参考大牛案例终结了一下,话不多说代码如下: 实现效果: 前段代码 <view class="text-box"> <view& ...

  5. C++ 编程学习(六) 函数

    零.小知识点 1.函数返回类型可以是除数组外的自定义类型 一.传值调用 向函数传递参数的传值调用方法,把参数的实际值复制给函数的形式参数.在这种情况下,修改函数内的形式参数不会影响实际参数. 默认情况 ...

  6. Linux / MacOS 下Redis 安装、配置和连接

    下载 下载redis压缩包 最新的为 5.0.4 地址 http://download.redis.io/releases/redis-5.0.4.tar.gz 安装 1 解压 切换工作目录到redi ...

  7. web应用中并发控制的实现,各种锁的集合

    参考:http://blog.csdn.net/xiangwanpeng/article/details/55106732 B/S构架的应用越来越普及,但由于它有别于C/S构架的特殊性,并发控制始终没 ...

  8. 四、Antd组件扩展

    注意:先安装扩展,在安装antd框架,否则会提示 一.安装扩展 1.组件 dva 查看项目依赖 原因是我全局安装,依赖为空, npm i dva 查看依赖 cli装global 当访问报错: Warn ...

  9. matplotlib画图--Line Color

    1.线形 2.标记 3.颜色

  10. ArchLinux安装KDE桌面

    ArchLinux安装KDE桌面 一.链接网络 1.有线 # dhcpcd 2.无线 # wifi-menu 3.检查 # ping www.baidu.com 二.安装X服务 # pacman -S ...