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. NO17--vue父子组件间单向数据流的解决办法

    在上一篇中讲解了父子组件之间是如何传值的,如果子组件需要改变传过来的数据供自己使用,或者想在子组件中改变传过来的数据并同步到父组件,那么直接改肯定是不行的,如果你这么做了,Vue 会在控制台给出警告. ...

  2. Received non-all-whitespace CHARACTERS or CDATA event in nextTag(). ,无法整齐打印验证错误。 解析XML文档出现的问题

    在启动keyCloak,想要在standAlone模式下切换数据库,修改standAlone.xml文件时. 在bin/目录下启动standAlone模式出现错误: 10:07:24,799 INFO ...

  3. 3分钟手把手带你搭建基于selenium的自动化框架

    1 .什么是seleniumSelenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...

  4. 微软职位内部推荐-Software Engineer II_VS

    微软近期Open的职位: Job Title: Software Engineer II Division: Visual Studio China – Developer Division Work ...

  5. head和tail命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/amosli/p/3496027.html 当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相 ...

  6. nodejs 服务器实现区分多客户端请求服务

    初始实现 var net = require('net');//1 引入net模块 var chatServer = net.createServer();//创建net服务器 var clientL ...

  7. python的多路复用实现聊天群

    在我的<python高级编程和异步io编程>中我讲解了socket编程,这里贴一段用socket实现聊天室的功能的源码,因为最近工作比较忙,后期我会将这里的代码细节分析出来,目前先把代码贴 ...

  8. python 原生态调用server服务————SimpleHTTPServer

    python 原生态调用server服务,接收http传递的参数并且处理返回结果 很多blog中都是抄了官网的,没有说明参数如何接收 1.代码中提供了post与get两种方式来发起请求,但是传递参数时 ...

  9. bootstrap轮播图不能显示左右箭头

    引入font文件夹即可 原文 :http://www.imooc.com/qadetail/64277

  10. oracle和mysql对时间与字符串的转换

    1,oracle to_date(#{item.value},'YYYY-MM-DD hh24-mi-ss') to_char(CRERATE_TIME,'YYYY-MM-DD hh24-mi-ss' ...