Milk Pumping G&Milk Routing S 题解
Milk Pumping G&Milk Routing S
双倍经验时间
洛谷P5837 [USACO19DEC]Milk Pumping G
洛谷P3063 [USACO12DEC]Milk Routing S
题目模型
给定\(N\)个点和\(M\)条边,对于每条边,给定连接的两个端点以及这条边的花费和“流量”
设这条路径上所有边的花费总和为\(L\)
设这条路径上所有边中“流量”值最小的为\(C\)
要求找出一条\(1\)到\(N\)的路径满足:\(L\)尽可能小的同时\(C\)尽可能大(注意是一条路径上的L和C)
解题思路
如果是单独求\(L\)或者\(C\)中的一个,那么我们很容易便能解决
但是如果要求同时维护\(L\)和\(C\)两个值,而且这两个值还是矛盾的,那我们怎么做呢?
(这里的矛盾指:\(L\)要尽量小,而同一条道路的\(C\)又要尽量大)
- First
首先我们先来考虑用一个最短路同时维护这两个值,但经过一番思索,我们会发现无法做到
为什么?因为这两个值矛盾啊!相矛盾的两个值怎么能在同一个最短路中解决呢?
- Second
否定了同时维护的想法,我们只能考虑分开维护,分开维护?多个最短路?
肯定也不行,为什么?维护出来的\(L\)、\(C\)分别对应的最短路径不一定是同一条啊!最短路径都不是同一条那\(L\)、\(C\)怎么会相对应呢?
- Third
同时维护和分开维护都不行,那怎么做?
枚举
什么意思?
我们要维护对应的两个值,那我们可以枚举其中一个值,然后再在枚举的这个值的基础上去寻找对应的另一个值呀!
怎么实现呢?
假设我们枚举\(Ci\),然后跑最短路去求解对应的\(Li\),在跑最短路时判断当前点\(v\)的\(Cv\)值是否小于\(Ci\),如果小于那么就不管这个点(因为我们枚举的\(Ci\)已经是假定的最小流量值,那么所有小于\(Ci\)肯定没有用)
为什么\(Ci\)是假定的最小流量值?不是求最大的\(C\)吗?
我们不断枚举\(Ci\),找到所有对应的\(Li\),然后用一个\(ans\)来记录最终的答案,最终找到的一定是最大的\(C\)和最小的\(L\)
代码Code
#include <bits/stdc++.h>
using namespace std;
int n,m,a,b,c,f,tot,ans;
int dis[100010],vis[100010],head[100010];
priority_queue<pair<int,int> > shan;
struct node {
int to,net,liu,val;
} e[100010];
inline void add(int u,int v,int w,int l) {
e[++tot].to=v;
e[tot].net=head[u];
e[tot].liu=l;
e[tot].val=w;
head[u]=tot;
}
inline void dijkstra(int l) {
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
shan.push(make_pair(0,1));
while(!shan.empty()) {
int x=shan.top().second;
shan.pop();
if(vis[x]==1) continue;
vis[x]=1;
for(register int i=head[x];i;i=e[i].net) {
int v=e[i].to;
if(e[i].liu<l) continue;
if(dis[v]>dis[x]+e[i].val) {
dis[v]=dis[x]+e[i].val;
shan.push(make_pair(-dis[v],v));
}
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;i++) {
scanf("%d%d%d%d",&a,&b,&c,&f);
add(a,b,c,f);
add(b,a,c,f);
}
for(register int li=1;li<=1000;li++) {
dijkstra(li);
if(dis[n]!=0x3f) ans=max(ans,li*1000000/dis[n]);
}
printf("%d",ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n,m,x,u,v,w,c,tot,ans=20050206;
int dis[510005],vis[510005],head[510005],flag[510005];
priority_queue<pair<int,int> > shan;
struct node {
int to,net,val,liu;
} e[510005];
inline void add(int u,int v,int w,int l) {
e[++tot].to=v;
e[tot].val=w;
e[tot].liu=l;
e[tot].net=head[u];
head[u]=tot;
}
inline void dijkstra(int li) {
for(register int i=1;i<=n;i++) {
vis[i]=0;
dis[i]=20050206;
}
dis[1]=0;
shan.push(make_pair(0,1));
while(!shan.empty()) {
int xx=shan.top().second;
shan.pop();
if(vis[xx]) continue;
vis[xx]=1;
for(register int i=head[xx];i;i=e[i].net) {
int v=e[i].to;
if(e[i].liu<li) continue;
if(dis[v]>dis[xx]+e[i].val) {
dis[v]=dis[xx]+e[i].val;
shan.push(make_pair(-dis[v],v));
}
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&x);
for(register int i=1;i<=m;i++) {
scanf("%d%d%d%d",&u,&v,&w,&c);
flag[i]=c;
add(u,v,w,c);
add(v,u,w,c);
}
for(register int i=1;i<=m;i++) {
dijkstra(flag[i]);
if(dis[n]!=20050206) ans=min(ans,dis[n]+x/flag[i]);
}
printf("%d",ans);
return 0;
}
自认为讲得还是很详细的,如果还有什么不懂的欢迎留言qwq
最后,感谢一下RHL大佬对我的指导
Milk Pumping G&Milk Routing S 题解的更多相关文章
- 洛谷 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\ ...
- 【luogu P3063 [USACO12DEC]牛奶的路由Milk Routing】 题解
题目链接:https://www.luogu.org/problemnew/show/P3063#sub 我很好奇这道题为什么没被收入SPFA好题 #include <cstdio> #i ...
- 题解 P5837 【[USACO19DEC]Milk Pumping】
这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...
- Milk Pumping
今天第一次正式打个人定位赛,还是太菜,这题连枚举加最短路都没想到,显然菜是原罪. 题面: : 题解:其实方法很多,千万别浪到网络流用dinic求最大网络流求的最小费用,这题不一样.最大流/最小费用 不 ...
- P5838 [USACO19DEC]Milk Visits G
发现是一道比较裸的树上莫队,于是就开始刚,然后发现好像是最难的一道题--(本题解用于作者加深算法理解,也欢迎各位的阅读) 题意 给你一棵树,树有点权,询问一条路径上是否有点权为 \(c\) 的点. 题 ...
- buaacoding_2018算法期末上机G题.地铁建设题解
// 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...
- BNUOJ48605International Collegiate Routing Contest 题解
题目大意: 给你一些子网,求它们在整个网段的补集. 思路: 将子网转换成二进制建一棵Trie,直接DFS搜到没有了就记下来输出.注意:所给的子网会有交集,若搜到结尾就不向下搜了. 代码: #inclu ...
随机推荐
- 什么!你想要封装好的ajax
ajax作为前端开发领域一个必不可少的内容,也是灵魂所在,今天就ajax的封装给大家做一个分析, 如果没有猜错的话现在基本上用原生去写ajax的意见不多了,这是肯定的 ,为什么这么说,jq的ajax大 ...
- iOS-Code Data的快速体验
Code Data Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据 ...
- jQuery实现拖拽元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 在Asp.NET Core中如何优雅的管理用户机密数据
在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法.在早期VB/VB.NET时代,经常使用.ini文 ...
- Mac Book 问题汇集
1.mac wifi 无法连接问题 1. 由于插入的USB 转接头导致,USB转接口带有网线插口,机器默认网页接口接口导致. 解决方案: 拔掉转接口,连上WiFi ,再插入转接口使用 2.可以是路由器 ...
- 测试-spring源码摘取
首次加载idea是真的慢... 也许是我电脑性能太差... 我分析他内部有一套索引的机制,需要每次打开现建立... 没有固态的话,首次打开还不如eclipse 第一次使用博客园,以前都在csdn混~ ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
- 搭建redis哨兵模式
搭建redis哨兵模式,一主两从三哨兵 1.从官网下载redis安装包:此处是redis-5.0.7.tar.gz 2.上传到目录 /utxt/soft 3.解压 4.cd /utxt/soft/ ...
- OO第二单元——兜兜转转之神秘电梯
一.设计策略及程序结构分析 1.第一次作业 第一次作业是需要我们用多线程模拟一个实时电梯系统,功能比较简单正常,但要有捎带功能,我采用的调度策略便是指导书上提供的ALS调度策略,采用消费者-生产者模式 ...
- tensorflow-TFRecord 文件详解
TFRecord 是 tensorflow 内置的文件格式,它是一种二进制文件,具有以下优点: 1. 统一各种输入文件的操作 2. 更好的利用内存,方便复制和移动 3. 将二进制数据和标签(label ...