洛谷 P4009 汽车加油行驶问题 解题报告
P4009 汽车加油行驶问题
题目描述
给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示。
一辆汽车从起点◎出发驶向右下角终点▲,其坐标为\((N,N)\) 。
在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:
汽车只能沿网格边行驶,装满油后能行驶\(K\)条网格边。出发时汽车已装满油,在起点与终点处不设油库。
汽车经过一条网格边时,若其\(X\)坐标或\(Y\)坐标减小,则应付费用\(B\),否则免付费用。
汽车在行驶过程中遇油库则应加满油并付加油费用\(A\) 。
在需要时可在网格点处增设油库,并付增设油库费用\(C\)(不含加油费用\(A\))。
\(N,K,A,B,C\)均为正整数, 且满足约束: \(2≤N≤100,2≤K≤10\) 。
设计一个算法,求出汽车从起点出发到达终点所付的最小费用。
输入输出格式
输入格式:
文件的第一行是 \(N,K,A,B,C\)的值。
第二行起是一个 \(N×N\)的0-1方阵,每行\(N\)个值,至\(N+1\)行结束。
方阵的第\(i\)行第\(j\)列处的值为1表示在网格交叉点\((i,j)\)处设置了一个油库,为\(0\)时表示未设油库。各行相邻两个数以空格分隔。
输出格式:
程序运行结束时,输出最小费用。
说明
\(2≤n≤100,2≤k≤10\)
据说是费用流,没看出来。连分层图都没看出来,胡乱打了个最短路偏分发现居然有强制消费。
分层图按\(k\)也就是走的步数来分层,但这里我打了优先队列BFS,本质上和disj最短路的思想是一样的,但似乎跑的慢一些??
Code:
#include <cstdio>
#include <queue>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N=103;
const int I[5]={0,0,1,0,-1};
const int J[5]={0,1,0,-1,0};
int n,k,a,b,c;//方格大小,可连边长,加油费,倒车费,开厂费
int used[N][N][12],g[N][N],cost[5];
void init()
{
scanf("%d%d%d%d%d",&n,&k,&a,&b,&c);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
cost[3]=cost[4]=b;
}
struct node
{
int i,j,w,dep;
node(){}
node(int i,int j,int w,int dep)
{
this->i=i;
this->j=j;
this->w=w;
this->dep=dep;
}
bool friend operator <(node n1,node n2)
{
return n1.w>n2.w;
}
};
priority_queue <node > q;
void work()
{
node t0(1,1,0,0);
q.push(t0);
while(!q.empty())
{
int ii=q.top().i,jj=q.top().j,dep=q.top().dep,w=q.top().w;
q.pop();
if(ii==n&&jj==n)
{
printf("%d\n",w);
exit(0);
}
if(used[ii][jj][dep]) continue;
used[ii][jj][dep]=1;
for(int l=1;dep!=k&&l<=4;l++)
{
int i=ii+I[l],j=jj+J[l];
if(i>n||i<1||j>n||j<1) continue;
if(!g[i][j])
{
if(!used[i][j][dep+1])//直接走
{
node tt(i,j,w+cost[l],dep+1);
q.push(tt);
}
if(!used[i][j][0]&&i!=n&&j!=n)//开工厂
{
node tt(i,j,w+cost[l]+c+a,0);
q.push(tt);
}
}
if(g[i][j]&&!used[i][j][0])//强制消费
{
node tt(i,j,w+cost[l]+a,0);
q.push(tt);
}
}
}
}
int main()
{
init();
work();
return 0;
}
2018.7.5
洛谷 P4009 汽车加油行驶问题 解题报告的更多相关文章
- 洛谷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的边: 否则,这个点的 ...
- P4009 汽车加油行驶问题
P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- Luogu P4009 汽车加油行驶问题
题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
随机推荐
- node安装和npm全局配置
本文章环境 windows10 64位家庭版 Node10.15.3LTS 安装包下载 Node官网 安装node 点击安装文件, 一键安装, 注意安装位置和添加到环境变量(xx to PATH)选项 ...
- 九九乘法表的python复习
九九开始的复习 这周复习之前的学的知识关于range函数,gormat函数,print的使用总结一下 从一个小例子开始,开始我的回顾吧, 大家都是从那个九九乘法表开始的数学之旅,从一一得一,开始了我们 ...
- 关于jsp中引用css外部样式无效时的处理方法
今天做项目遇到的一个小问题,如下所示: <link href="./bootstrap/css/bootstrap.min.css" rel="stylesheet ...
- scrapy的简单使用
使用之前的创建虚拟环境方法(pipenv) 创建虚拟环境并进入虚拟环境 mkdir douban cd douban pipenv install pipenv shell 再安装我们的scrapy ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 使用AD对Linux客户端进行身份验证
https://technet.microsoft.com/zh-cn/library/2008.12.linux.aspx
- userdel命令详解
基础命令学习目录首页 原文链接:http://www.360doc.com/content/15/0814/14/2149364_491595091.shtml 命 令: userdel 功能说明: ...
- Python中collections模块的使用
本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...
- mysql实现oracle sequence方案
转自: http://blog.csdn.net/javaGirlOne/article/details/47256183 背景:先总结一下MYSQL 自增长与ORACLE 序列的区别: 自增长只能用 ...
- DataGridView 复选框 操作大全
DataGridViewCheckBoxColumn dtCheck = new DataGridViewCheckBoxColumn(); dtCheck.DataPropertyName = &q ...