洛谷P4009 汽车加油行驶问题

汽车加油行驶问题-动态规划(代码简明 有详细注释).cpp 给定一个N*N 的方形网格,设其左上角为起点,坐标为(1,1),X轴向右为正,Y轴向下为正,每个方格边长为1。一辆汽车从起点出发驶向右下角终点,其坐标为(N,N)。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则应付费用B,否则免付费用。 (3)汽车在行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油 立即下载

虽然写着网络流,但是似乎spfa跑最短路更好做一些。
需要注意的是如果某个地方有油站,那么是一定要加满油才能往后走的。
然后距离的记录以及边与平时的spfa有一些不同。
每个点如果有油,可以往4个方向转移。
别的就没有什么了。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
struct node{
    int x,y,k;
};
queue<node>que;
int dis[105][105][15],fuel[105][105];//dis记录距离,x,y记录坐标而k记录油量
bool inque[105][105][15];
int main()
{
    int n,k,A,B,C,i,j;
    int move1[4][2]={1,0,-1,0,0,1,0,-1};
    cin>>n>>k>>A>>B>>C;que.push(node{1,1,k});memset(dis,0x3f,sizeof(dis));
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            cin>>fuel[i][j];
    dis[1][1][k]=0;//注意初始化
    while(!que.empty()){
        node node1=que.front();que.pop();
        inque[node1.x][node1.y][node1.k]=false;
        if(fuel[node1.x][node1.y]&&node1.k!=k){
            if(dis[node1.x][node1.y][k]>dis[node1.x][node1.y][node1.k]+A){
                dis[node1.x][node1.y][k]=dis[node1.x][node1.y][node1.k]+A;
                if(!inque[node1.x][node1.y][k]){
                    que.push(node{node1.x,node1.y,k});inque[node1.x][node1.y][k]=true;
                }
            }
            continue;//如果这个点有油站,那么一定必须先把油加满再去考虑下一步
        }
        else{//可以添加 油站
            if(dis[node1.x][node1.y][k]>dis[node1.x][node1.y][node1.k]+A+C){
                dis[node1.x][node1.y][k]=dis[node1.x][node1.y][node1.k]+A+C;
                if(!inque[node1.x][node1.y][k]){
                    que.push(node{node1.x,node1.y,k});inque[node1.x][node1.y][k]=true;
                }
            }
        }
        if(node1.k){//如果有油才能往后走
            for(i=0;i<4;i++){
                if(node1.x+move1[i][0]<1||node1.x+move1[i][0]>n||node1.y+move1[i][1]<0||node1.y+move1[i][1]>n)
                    continue;
                if(move1[i][0]<0||move1[i][1]<0){
                    if(dis[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]>dis[node1.x][node1.y][node1.k]+B){
                        dis[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]=dis[node1.x][node1.y][node1.k]+B;
                        if(!inque[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]){
                            inque[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]=true;
                            que.push(node{node1.x+move1[i][0],node1.y+move1[i][1],node1.k-1});
                        }
                    }
                }
                else{
                    if(dis[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]>dis[node1.x][node1.y][node1.k]){
                        dis[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]=dis[node1.x][node1.y][node1.k];
                        if(!inque[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]){
                            inque[node1.x+move1[i][0]][node1.y+move1[i][1]][node1.k-1]=true;
                            que.push(node{node1.x+move1[i][0],node1.y+move1[i][1],node1.k-1});
                        }
                    }
                }
            }
        }
    }
    int ans=(1<<31)-1;
    for(i=0;i<=k;i++)
        ans=min(ans,dis[n][n][i]);//,cout<<dis[n][n][i]<<' ';
    cout<<ans<<endl;

    return 0;
}
汽车加油行驶问题 C++算法实现 给定一个N*N 的方形网格,设其左上角为起点,坐标为(1,1),X 轴向右为正,Y 轴向下为正,每个方格边长为1。一辆汽车从起点出发驶向右下角终点,其坐标为(N,N)。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当汽车行驶经过一条网格边时,若其X 坐标或Y 坐标减小,则应付费用B,否则免付费用。 (3)汽车在行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费用A)。 (5)(1)~(4)中的各数N、K、A、B、C均为正整数。 立即下载

相关推荐

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

汽车加油行驶问题全网最详细(动态规划+画图)

问题描述 给定一个N*N的网络,左上角记为起点S,坐标为(1,1),坐标轴方向及距离标识见图。一辆汽车从起点S出发驶向右下角终点(N,N)。在部分网格交叉点,设置了油库,可供汽车在行驶途中,为其加油。汽车在行驶途中需遵守如下规则: •1.汽车只能沿着网格边行驶,装满油后只能行驶K条网格边。出发时已装满油,起点和终点不设油库 •2.当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则需付费B,否则免付费用 •3.汽车行驶过程中若遇到油库,则需加满油并付油费A •4.在需要时可在网格点增设油库,并付

u013177138的博客 4490

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

C语言算法——加油站问题

实现思路 :因为加油站一样,则gas,cost数组每次使用的下标是一样的,开始油量为开始加油站的gas,设汽车油量为k,每次到下个加油站的油量即为k+gas[i]-cost[+1],历遍所有,判断最后油量k是否大于0。题目要求 :汽车初始油量为0,设定任意个加油站,每个加油站拥有两个数值(1,可以加的油量gas 2,开往下一个加油站所需要消耗的油量cost),求得可以 完整 使汽车开完一个周期的 起始加油站 的下标。3,由于初始油量k为初始gas,我们需要判断能否进行第一次开车,所以先将第一次计算。

z20050018的博客 971

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

Visual Studio 2022 社区版安装指南:从下载到配置的完整流程

本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。

weixin_28829339的博客 879

算法设计二(3)——汽车加油行驶问题

pan.baidu.com/s/1w-VSMWmr9ntEWWdxZoD4Yw 码:jnlh 算法分析与设计第 2 次实验 时间 2020.4.23 实验名称 汽车加油行驶问题 实验目的 通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。 ......

weixin_43973089的博客 4720

TI C2000 DSP CLA实战:用F28069的协处理器实现ADC采样与PWM相位实时联动控制

本文详细介绍了如何利用TI C2000系列DSP的CLA协处理器在TMS320F28069上实现ADC采样与PWM相位的实时联动控制。通过CLA的零周期上下文切换和硬件级任务触发特性,显著提升了电机控制和数字电源应用的实时性能,特别适用于需要亚微秒级响应的场景。

weixin_30932215的博客 3968

P4009 汽车加油行驶问题(分层图最短路)

题目描述 给定一个 N×N 的方形网格,设其左上角为起点◎,坐标(1,1),X 轴向右为正, Y 轴向下为正,每个方格边长为 1 ,如图所示。 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为 (N,N)。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶 K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。 汽车...

Endeavor_G的博客 718

避坑指南:STM32CubeMX安装后,你的第一个工程为什么中文全是乱码?

本文详细解析了STM32CubeMX安装后中文乱码问题的根源及解决方案。从诊断乱码现象到分析编码冲突背景,提供了新项目UTF-8化、旧项目GBK兼容及版本降级等多种实用方案,帮助开发者彻底解决这一常见问题。

weixin_30699955的博客 474

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

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

题目要满足三个条件: 1:汽车经过一条网格边时,若其 X 坐标或 Y 坐标减小,则应付费用 B ,否则免付费用。 2:汽车在行驶过程中遇油库则应加满油并付加油费用 A。 3:在需要时可在网格点处增设油库,并付增设油库费用 C(不含加油费用A )。 4:汽车只能沿网格边行驶,装满油后能行驶 K 条网格边。 思路:这题是洛谷网络流24题里的,但是题解都是清一色的最短路哈哈。建图跑最短路。根据费用分层,因为装满油只能走k次,所以我们分为k+1层,第0层代表满油,第一层代表消耗了一单位油。 对于第一个条件:我们在这

我是蒋卫升呀~ 473

Unreal Engine开发:角色动画与状态机_动画混合:通过混合节点实现平滑动画过渡

动画混合是提升游戏动画质量的关键技术之一。Unreal Engine提供了多种混合节点,包括BlendSpace1D、Blend Two By Bool、Blend Two By Alpha和Sequencer,每种节点适用于不同的场景。通过合理使用这些节点,可以实现平滑、自然且高效的动画过渡效果。此外,遵循最佳实践和高级应用技巧,可以进一步优化动画质量和性能。希望本节内容对你在Unreal Engine中实现动画混合有所帮助,使你的游戏角色动作更加流畅和自然。

chenlz2007的博客 1245

洛谷P4009:汽车加油行驶问题

题目描述 给定一个N×N的方形网格,设其左上角为起点◎,坐标(1,1),X轴向右为正, Y轴向下为正,每个方格边长为 1,如图所示。 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(N,N)。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶 K条网格边。...

Deep_Kevin的娱乐空间 2879

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

洛谷 P4009 汽车加油行驶问题 分层图 网络流 最小费用最大流 Dinic+Spfa 最短路

题目链接: https://www.luogu.com.cn/problem/P4009 思路来源博客: https://blog.youkuaiyun.com/qq_45458915/article/details/103630951 思路解释的非常清晰,建议再次查看 算法:1:分层图 网络流 最小费用最大流 Dinic+Spfa 最短路 图解: 1:选择一个n=3的单元来辅助理解思路 ...

aiwo1376301646的博客 432

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汽车加油行驶问题(洛谷P4009 分层图费用流)

分层图+费用流

weixin_51596558的博客 303

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

洛谷 P4009 汽车加油行驶问题(最小费用流)

汽车加油行驶问题 题目链接:https://www.luogu.org/problem/P4009 题意 有n*n的方格网络,一辆车初始在(1,1),目标为(n,n),车的油箱大小为k,初始油箱满的,每次可以往上下左右走一步,耗油1,部分格点上有加油站,路过必须加油,代价A,同时如果汽车往上走或往左走,代价为B,可以在某些格点增设加油站,需要代价C,求到达目标点的最小花费。 题解: 网络流24题,...

sigh_的博客 636

洛谷 P4009 汽车加油行驶问题 解题报告

P4009 汽车加油行驶问题 题目描述 给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示。 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为\((N,N)\) 。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶\(K\)条...

weixin_30511107的博客 236

洛谷·[网络流24题]汽车加油行驶问题

洛谷P4009 [网络流24题] 汽车加油行驶问题 分层图最短路 最小费用流

樱狸✨愿携清风归来处 391

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

题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题; 把每个点拆成各个油量上的点,根据要求连边即可; 注意:点数最大为100*100*11,因为虽然k<=10,但还有k=0的状态!(竟然因为边界调了一晚上) 代码如下: #include<iostream> #include&l...

aodan5477的博客 222

洛谷 P4009 汽车加油行驶问题 题解

原题题面 网络流24题?费用流?不存在的 tag都是骗人的 首先看题,仔细想想,这不就是一个最短路吗? 然而本蒟蒻看不出一些题解中说的分层图最短路,于是直接写单源最短路 从(1,1)往(n,n)跑最短路,以dis[x][y][res]来记录当位于(x,y)时还能再跑res条边的最小花费 每次扩展节点的时候更新加油的花费,注意当(x,y)有油库时强制加油,没有时可...

weixin_30393907的博客 234

洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)

题目链接:点击查看 题目大意:给出一个n*n的矩阵表示道路,途中有一些加油站,现在要从点(1,1)到达点(n,n),问最小花费,其中的一些规则如下: 汽车只能沿着网格边行驶,装满油后可以行驶K条边,出发时已经装满油 汽车经过一条网格边时,若x或y减小,需要花费B元,其余情况没有花费 汽车在行驶过程中遇到油库则必须强制加满油,并花费A元 在需要时可以在网格点增设临时油库,并支付花费C元(不...

Falcon的博客 1109

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

传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这样每一个状态都可以唯一表示。能互相转移的状态之间连有向边,然后跑一个最短路就行了 具体细节看代码好了……细节太多说不清楚…… ps:据说还可以用这个思想跑费用流,我估摸着大概是建源$S...

weixin_33755649的博客 127
上一篇: 有上下界的网络流 做法总结
下一篇: Codeforces Round #462
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值