大致题意:给定一个 N ∗ N N*N N∗N的方形网格,其中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
-