P4009 汽车加油行驶问题
最短路
清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短)
顺便说一句,堆优化Dj跑分层图灰常好写
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;}
struct data{ //对于不同题目的要求,我们只需要在结构体中按题意增减变量即可
int d,x,y,k; //d:费用 x,y:坐标 k:油量
bool operator < (const data &tmp) const {return d>tmp.d;}
}; priority_queue <data> h;
int d1[]={,,,-};
int d2[]={,,-,};
int n,tk,a,b,c,ans=2e9,d[][][],oil[][];
int main(){
scanf("%d%d%d%d%d",&n,&tk,&a,&b,&c);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
scanf("%d",&oil[i][j]);
memset(d,,sizeof(d));
h.push((data){d[tk][][]=,,,tk}); //优先队列直接放结构体
while(!h.empty()){
data u=h.top(); h.pop();
if(u.d!=d[u.k][u.x][u.y]) continue; //记忆化
if(!u.k) u.k=tk,u.d+=a+c; //没油了就新建一个油库并加油
for(int i=;i<;++i){
int r1=u.x+d1[i],r2=u.y+d2[i],cost= i> ? b:; //cost:当向左或向上是要加的费用
if(r1<||r1>n||r2<||r2>n) continue;
if(oil[r1][r2]){ //有油库必须加满
if(u.d+cost+a<d[tk][r1][r2]){
d[tk][r1][r2]=u.d+cost+a;
h.push((data){d[tk][r1][r2],r1,r2,tk});
}
}else if(u.d+cost<d[u.k-][r1][r2]){ //普通的行驶
d[u.k-][r1][r2]=u.d+cost;
h.push((data){d[u.k-][r1][r2],r1,r2,u.k-});
}
}
}
for(int i=;i<=tk;++i) ans=min(ans,d[i][n][n]); //查找最小值
printf("%d",ans);
return ;
}
P4009 汽车加油行驶问题的更多相关文章
- 洛谷 P4009 汽车加油行驶问题 解题报告
P4009 汽车加油行驶问题 题目描述 给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示. 一辆汽车从起 ...
- 洛谷P4009 汽车加油行驶问题
题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...
- 洛谷P4009汽车加油行驶问题——网络流24题(最短路)
题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...
- 洛谷P4009 汽车加油行驶问题(分层最短路)
传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...
- 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】
分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...
- Luogu P4009 汽车加油行驶问题
题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...
- 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]
[题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- 【刷题】LOJ 6223 「网络流 24 题」汽车加油行驶问题
题目描述 给定一个 \(\text{N}\times \text{N}\) 的方形网格,设其左上角为起点◎,坐标为 \(\text{(1,1)}\) ,\(\text{X}\) 轴向右为正, \(\t ...
随机推荐
- easyui datagrid columns的field支持属性的子属性(field.sonfield形式或者格式化程序形式)
var col=$(_758).datagrid("getColumnOption",_75e);if(col){//var _75f=_75c[_75e];var _75f=un ...
- android adt自带eclipse无法设置ndk路径
android sdk官网下载r23版本的adt时自带的eclipse没有设置ndk路径的地方,通过Install New Software 发现无法更新,那么如何解决这个问题呢? 软件百度云 ...
- 【技术分享】Java 序列化与反序列化安全分析
唯品会安全应急响应中心 https://mp.weixin.qq.com/s?src=11×tamp=1546915765&ver=1317&signature=mW ...
- JavaScript中的对象描述符(属性特性)
我们先创建一个对象: var person = { name: "Nicholas", _job: "Software Engineer", sayName: ...
- django model field validator 设置
转自:http://blog.csdn.net/cwjcwj520/article/details/17330845 例子为想在创建用户名的时候验证输入字符是否有效,并且插入了even_field为C ...
- div+css网页标准布局实例教程(三)
前边两节学完后,前台工作基本上完成了,下边的任务该程序员添加程序了.为什么说是基本完成呢?因为要做的工作还很多,不但要把首页做出来,其它的列表页详细页等页面也得做.还要配合程序员把整个网站完成,这样才 ...
- windows上apache是线程处理请求,linux上apache是进程处理请求
windows上apache是线程处理请求,linux上apache是进程处理请求
- windows平台mysql密码设置
登录mysql默认没有指定账号 查看默认账号是谁 select user(); mysql> select user();+----------------+| user() |+------- ...
- Linuxer-"Linux开发人员自己的媒体"第五月稿件和赠书名单
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/juS3Ve/article/details/78859630 Linuxer已经从一个单纯的读者服务 ...
- iOS连续上传多张图片
参考地址:http://www.cocoachina.com/ios/20180730/24366.html 需求是怎样的:for 循环里面.多个网络请求上传图片,每次上传一张,至于为什么每次只上传一 ...