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. GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高。

    GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...

  2. which命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/jkin/p/10289085.html Linux which命令用于查找文件. which指令会在环境变量$PATH ...

  3. 常用算法Java实现之希尔排序

    希尔排序严格来说是基于插入排序的思想,又被称为缩小增量排序. 具体流程如下: 1.将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对... 2.对每对数据进行比较和交换, ...

  4. Task 4 求数组的连续子数组的最大和(团队合作)

    小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...

  5. 关于datatable的数据绑定问题

    最近做项目掉在数据绑定这个小坑里了,最后发现问题其实很简单,只是官方的文档描述可能不太清除导致的吧.首先贴上官网地址:http://www.datatables.club/ 关于这个插件的简单使用就不 ...

  6. P4论文粗读笔记(一)

    一 文章名称:SNAP: Stateful Network-Wide Abstractions for Packet Processing 数据包处理的带状态网络概念 发表时间:2016 期刊来源:S ...

  7. 文件名命工具类(将指定目录下的文件的type类型的文件,进行重命名,命名后的文件将去掉type)

    import java.io.File; /** * <b>function:</b> 文件命名工具类 * @author hoojo * @createDate 2012-5 ...

  8. Gradle入门(4):依赖管理

    在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极具挑战的.这也是为什么依赖管理对于每个软件项目都是至关重要的一部分. 这篇教程主要讲述如何使用Gradle管理我们项目的依赖,我们 ...

  9. 深入理解JAVA集合系列四:ArrayList源码解读

    在开始本章内容之前,这里先简单介绍下List的相关内容. List的简单介绍 有序的collection,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...

  10. SQL语句中order_by_、group_by_、having的用法区别

    order by 从英文里理解就是行的排序方式,默认的为升序. order by 后面必须列出排序的字段名,可以是多个字段名. group by 从英文里理解就是分组.必须有“聚合函数”来配合才能使用 ...