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 汽车加油行驶问题 解题报告的更多相关文章

  1. 洛谷P4009 汽车加油行驶问题

    题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...

  2. 洛谷P4009汽车加油行驶问题——网络流24题(最短路)

    题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为10 ...

  3. 洛谷P4009 汽车加油行驶问题(分层最短路)

    传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...

  4. 洛谷 P4009 汽车加油行驶问题 【最小费用最大流】

    分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的 ...

  5. P4009 汽车加油行驶问题

    P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> ...

  6. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  7. Luogu P4009 汽车加油行驶问题

    题目链接 \(Click\) \(Here\) 分层图..好长时间没写差点要忘了\(hhhhh\),其实思路还是很明了的. 注意需要强制消费. #include <bits/stdc++.h&g ...

  8. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  9. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

随机推荐

  1. 微信小程序-帝国cms会员系统调用

    在用户->管理会员字段,增加如下字段:openidsession_keylsktokennicknameheadimg设置用户名长度然后,在系统,系统变最设置,用户设置,将注册用户名设置长度改成 ...

  2. React Native移动开发实战-4-Android平台的适配原理

    打开Android开发工具Android Studio,选择菜单 Open an existing AndroidStudio project,打开ch04项目的android文件夹,如图5.8所示. ...

  3. NO.4:自学python之路------内置方法、装饰器、迭代器

    引言 是时候开始新的Python学习了,最近要考英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用 ...

  4. 小刘的深度学习---Faster RCNN

    前言: 对于目标检测Faster RCNN有着广泛的应用,其性能更是远超传统的方法. 正文: R-CNN(第一个成功在目标检测上应用的深度学习的算法) 从名字上可以看出R-CNN是 Faster RC ...

  5. python 根据年月日,计算是这一年中的第几天

    利用python计算某一天是这一年中的第几天,例如,给定年份= 2019年,月份= 1,日期= 3,则返回3:因为2019-01-03日期是2019年的第3 天. 首先,我们要知道闰年.平年怎么区分: ...

  6. HTML基础学习总结

    一.HTML的一些基本描述 全称:Hyper Text Markup Language 定义:超文本标记语言,是标记语言而不是编程语言,使用标记标签来描述网页,所以也被称为网页 格式:标签对里面放纯文 ...

  7. 软工 · 第十二次作业 - Beta答辩总结

    福大软工 · 第十二次作业 - Beta答辩总结 写第十二次的时候操作失误直接在Beta版本的博客里改了...第七次冲刺的作业链接补在这里 Beta(7/7) 组长本次博客作业链接 项目宣传视频链接 ...

  8. windows和RedHat双系统安装说明

    该博客记录了安装windows和RedHat双系统的方法.这里的windows系统是win8.1,RedHat是RHEL-server-7.0-x86_64-LinuxProbe.Com.iso,该i ...

  9. .NET项目中常用的32个正则表达式总结

    最近没事总结了下最近所用到的正则表达式,下面32个是经常用到的,总结下来与大家分享. . "^-?[1-9]\\d*$",//整数 . "^[1-9]\\d*$" ...

  10. 014 C语言文法定义与C程序的推导过程