题解 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 的比赛变化挺大的,有部分分了,而且不再是固定十个点了(部分分只说这几个点满足这几个性质,以为十个点的我还高兴了一会,一提交,...),除此之外居然赛后还排名了.这 ...
随机推荐
- Flink 操作链与任务槽
Operator Chains(操作链) Flink出于分布式执行的目的,将operator的subtask链接在一起形成task(类似spark中的管道). 每个task在一个线程中执行. 将ope ...
- Linux基础命令层级图-01
Linux基础命令层级图-01:
- P 1021 个位数统计
转跳点:
- 【pwnable.kr】coin1
pwnable从入门到放弃又一发 说是一道pwnable,其实是一道coding... nc pwnable.kr 9007 连接上看看,玩硬币? 老子是来拿flag的,谁来哄孩子来了!!! 算了,f ...
- 数据类型和C#关系对应
sqlserver与c#中数据类型的对应关系///private string changetocsharptype(string type){string reval=string.empty;sw ...
- git使用代理
在使用git科隆一个repo的时候,因为这个repo的子模块是托管在google上的,还是因为gfw导致子模块科隆不下来 只好使用代理了,那么怎么配置git使用代理呢 代码如下 因为我用的是ss所以这 ...
- vps 跑流量
- Linux学习打卡20200214
- freeswitch初识
一.参考内容 1.<FreeSWITCH权威指南>杜金房.张令考著 2.FreeSwitch 国内源码快速下载 3.Ubuntu下freeSwitch安裝指导(推荐) 4.Freeswit ...
- re模块2
# 元字符+,*遇到?后就会变为贪婪匹配 print(re.findall('abc+?','abcccccc')) #['abc'] print(re.findall('abc*?','abcccc ...