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 ...
随机推荐
- Spark+IDEA单机版环境搭建+IDEA快捷键
1. IDEA中配置Spark运行环境 请参考博文:http://www.cnblogs.com/jackchen-Net/p/6867838.html 3.1.Project Struct查看项目的 ...
- python的笔记
np.argsort(x):返回数据x从小到大的索引值,记住是一个索引值.当你想获取从小到大的数据的时候,用到这个 data[::-1]:对数据data进行倒转 a=[0,1,2,3,4,5] a[: ...
- TensorFlow 度量张量和张量或者和零之间的误差值
用于一个回归任务或者正则问题 # l2损失,output= sum(x ** 2)/2 inputdata = tf.Variable(np.random.rand(2,3), dtype=np.fl ...
- 静默方式安装10g数据库软件+升级patch+手工建库
通常我们安装Oracle数据库软件,都是用OUI图形界面来完成的,但有些Unix/Linux系统中并未安装图形系统,也就无法使用图形界面来安装Oracle的产品了,对于这种场景,就只能采用静默方式来安 ...
- python数据结构之哈希表
哈希表(Hash table) 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是Has ...
- iOS钱包卡券开发(往钱包里面加自己的卡券)
参考文章 https://blog.csdn.net/sz_vcp2007/article/details/60762349 https://blog.csdn.net/eqera/article/d ...
- REDIS 六. 修复方案
六. 修复方案 6.1 禁止一些高危命令(重启redis才能生效) 修改 redis.conf 文件,禁用远程修改 DB 文件地址 rename-command FLUSHALL "&quo ...
- Linux下Miniconda量化环境安装
前言 linux目录相关知识 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./usr/local:用户级的程序目录,可以理解为 ...
- contenttypes - django组件
一.contenttypes介绍 它的作用:可以通过两个字段让表和N张表创建FK关系 二.ContentType.GenericForeignKey.GenericRelation 表结构: from ...
- 青蛙的约会---poj1061(扩展欧几里德)
题目链接:http://poj.org/problem?id=1061 就是找到满足 (X+mt)-(Y+nt) = Lk 的 t 和 k 即可 上式可化简为 (n-m)t + Lk = X-Y;满足 ...