【洛谷4009】汽车加油行驶问题(SPFA乱搞)

点此看题面大致题意:给定一个N∗NN∗NN*N的方形网格,其中1表示这个格子有油库,0表示这个格子没油库,且汽车加满油可以行驶kkk条网格边。如果遇到油库必须加满油并花费AAA元,如果XXX坐标或YYY坐标减少需花费BBB元,若需新建一个油库需花费CCC元(另需加油费AAA元)。问你从(1,1)(1,1)(1,1)到(N,N)(N,N)(N,N)的最少花费。SPFASPFASPFA...
摘要由CSDN通过智能技术生成

点此看题面

大致题意:给定一个 N ∗ N N*N NN的方形网格,其中1表示这个格子有油库,0表示这个格子没油库,且汽车加满油可以行驶 k k k条网格边。如果遇到油库必须加满油并花费 A A A元,如果 X X X坐标或 Y Y Y坐标减少需花费 B B B元,若需新建一个油库需花费 C C C元(另需加油费 A A A元)。问你从 ( 1 , 1 ) (1,1) (1,1) ( N , N ) (N,N) (N,N)的最少花费。


S P F A SPFA SPFA做法

先说明,这篇博客只讲 S P F A SPFA SPFA,不讲网络流。

我们可以用 d i s i , j , l dis_{i,j,l} disi,j,l来表示到达网格 ( i , j ) (i,j) (i,j),还能行驶 l l l条网格边所需的最小花费。

显然,初始化 d i s 1 , 1 , k = 0 dis_{1,1,k}=0 dis1,1,k=0,然后从 ( 1 , 1 ) (1,1) (1,1)出发跑最短路即可。

对于当前状态 ( i , j , l ) (i,j,l) (i,j,l),我们可以这样考虑它的转移:

  • 如果当前还能行驶的距离不等于 k k k(即油未加满)

    • 如果当前网格有油库,那么我们就可以花费 A A A元将状态转移至 ( i , j , k ) (i,j,k) (i,j,k),即:

      d i s i , j , k = m i n ( d i s i , j , k , d i s i , j , l + A ) dis_{i,j,k}=min(dis_{i,j,k},dis_{i,j,l}+A) disi,j,k=min(disi,j,k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述(完全解决) 给定一个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均为正整数。 你的任务:求汽车从起点出发到达终点的一条所付费用最少的行驶路线。 输入 有若干组数据。每组数据的第一行是N,K,A,B,C的值,2 £ N £ 100,2 £ K £ 10。第二行起是一个N*N 的0-1方阵,每行N个值,至N+1行结束。方阵的第i行第j列处的值为1表示在网格交叉点(i,j)处设置了一个油库,为0时表示未设油库。各行相邻的2 个数以空格分隔。 输出 对每组测试数据,一行输出找到的最优行驶路线所需的费用值。 输入样例 9 3 2 3 6 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 输出样例 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值