题解 P5837 【[USACO19DEC]Milk Pumping】
这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用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】的更多相关文章
- 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)
题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...
- P5837 [USACO19DEC]Milk Pumping G
题目描述 Farmer John 最近为了扩张他的牛奶产业帝国而收购了一个新的农场.这一新的农场通过一个管道网络与附近的小镇相连,FJ 想要找出其中最合适的一组管道,将其购买并用来将牛奶从农场输送到小 ...
- 【题解】[USACO19DEC]Milk Visits G
题目戳我 \(\text{Solution:}\) 这题不要把思想局限到线段树上--这题大意就是求路径经过的值中\(x\)的出现性问题. 最开始的想法是值域线段树--看了题解发现直接\(vector\ ...
- Milk Pumping G&Milk Routing S 题解
Milk Pumping G&Milk Routing S 双倍经验时间 洛谷P5837 [USACO19DEC]Milk Pumping G 洛谷P3063 [USACO12DEC]Milk ...
- P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)
为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...
- Milk Pumping
今天第一次正式打个人定位赛,还是太菜,这题连枚举加最短路都没想到,显然菜是原罪. 题面: : 题解:其实方法很多,千万别浪到网络流用dinic求最大网络流求的最小费用,这题不一样.最大流/最小费用 不 ...
- P5838 [USACO19DEC]Milk Visits G
发现是一道比较裸的树上莫队,于是就开始刚,然后发现好像是最难的一道题--(本题解用于作者加深算法理解,也欢迎各位的阅读) 题意 给你一棵树,树有点权,询问一条路径上是否有点权为 \(c\) 的点. 题 ...
- USACO19DEC题解
Bronze A Cow Gymnastics 题目:https://www.luogu.com.cn/problem/P5831 题解:用数组存一下出现位置,O(n^2)枚举一下就好. 代码: #i ...
- USACO 2019 December Contest 随记
Forewords 今年 USACO 的比赛变化挺大的,有部分分了,而且不再是固定十个点了(部分分只说这几个点满足这几个性质,以为十个点的我还高兴了一会,一提交,...),除此之外居然赛后还排名了.这 ...
随机推荐
- Swift 枚举enum
enum methodType{ case get case post case put case delete } 枚举赋值 enum methodType:String{ case get=&qu ...
- 浅谈Python之sys.argv
(1)sys.argv是什么 sys模块为进入解释器维护或使用的变量,以及与解释器相关的函数提供了途径.sys.argv在脚本程序中扮演了这样一个角色:将命令行输入的参数作为一个list传入脚本程序, ...
- mysql安装--window版
一.下载 二.解压 三.配置 四.环境变量 五.安装MySQL服务 六.启动MySQL服务 七.停止MySQL 一.下载 第一步:打开网址,https://www.mysql.com,点击downlo ...
- 转载:Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理
转载自:https://blog.51cto.com/wjw7702/1150225 一.概述 如今利用nginx做反向代理和负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文 ...
- java嵌套循环练习
打印一个等腰三角形 package com.lv.jj; import java.util.Scanner; public class DemoDy { public static void main ...
- 动态添加,删除class样式
function hasClass(obj, cls) { //class位于单词边界,判断class样式是否已经存在 return obj.className.match(new RegExp('( ...
- POJ 2593&&2479:Max Sequence
Max Sequence Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16329 Accepted: 6848 Des ...
- BGP(IBGP“内部路由器”和EBGP“外部路由器”)命令解析
BGP:基于策略的路径向量路由协议. ①:(attribute)属性描述路径. ②:使用TCP(端口179)作为传输协议——(IBGP多使用loopback端口建立update-source) IBG ...
- bash: java: command not found
[root@izm5eab8t820b79js38tbxz ~]# java -version -bash: java: command not found 出现上面问题,解决方法: [root@iz ...
- CocoaPods安装/卸载/初始化等常用操作
CocoaPods的官网:https://cocoapods.org/,官方指导文档https://guides.cocoapods.org/ 1)ruby gem源更换国内源gems.ruby-ch ...