題目傳送門
題目大意:有一張網格圖,起點為 (1,
1)
(1,1)
(1,1
),終點為 (n,
n)
(n,n)
(n,n
),汽車滿油時可以走 k
kk 步,每步只能沿著網格邊走,如果走到加油站則必須加滿油,費用為 a
aa,你也可以在任意地方新建乙個加油站,費用為 c
cc,走的過程中,如果 x
xx 或 y
yy 座標減小了那麼需要付出 b
bb 的費用,求出起點到終點的最小費用。
眾所周知,網路流24題**現一些最短路題是很正常的。
走 kk
k 步這個限制可以通過分層**決,建 k+1
k+1k+
1 層,每層對應當前還能走多少步,然後向上下左右走的邊都從當前點向下一層建。
如果走到加油站,則強制這個點走到最高層(即加滿油,能走的步數為 k
kk),然後加上 a
aa 的費用。要注意的是,如果此時已經在最高層,說明已經加過油了,就不需要了。
新建加油站的話就判斷一下 當前位置是否能更新最高層中的對應位置 即可。
**如下:
#include
#include
#include
using
namespace std;
#define maxn 200010
int n,k,a,b,c,a[
110]
[110];
struct edge
;edge e[maxn<<3]
;int first[maxn]
,len=0;
void
buildroad
(int x,
int y,
int z)
; first[x]
=len;
}int
pos(
int x,
int y)
bool oil[maxn]
,v[maxn]
;int q[maxn]
,st=
1,ed=
2,f[maxn]
,ans=
2147483640
;int f1[4]
=;int f2[4]
=;intmain()
}memset
(f,63
,sizeof
(f))
; q[st]=1
;f[1]=
0;v[1]
=true
;while
(st!=ed)
continue;}
if(!oil[x]
&&x>n*n)
}for
(int i=first[x]
;i;i=e[i]
.next)}}
for(
int c=
0;c<=k;c++
)ans=
min(ans,f[
(c+1
)*n*n]);
printf
("%d"
,ans)
;}
網路流24題 汽車加油行駛問題
我們設 dp i k 表示節點為i,現在還有k條邊可以走的狀態。然後跑乙個最短路就行了。因為是不定項更新,所以考慮spfa。注意到了加油站是強制消費。然後分向上下左右四個方向走和原地建加油站五種情況來討論。注意最後更新答案的時候k 0不要忘了考慮!要不然就會像我一樣wa掉乙個點 如下 include...
網路流24題 汽車加油行駛問題
題面 傳送門思路 汽車油箱最多只能裝10格油,因此可以依據油量建立分層圖 共11層 然後spfa跑最短路 不用把每一條邊都建出來,用的時候判斷就好了 沒了真是披著網路流外衣的最短路啊 code 1 include2 include3 include4 include5 define inf 1000...
汽車加油行駛問題 網路流24題 SPFA
一開始是想跑bfs 去做,但是後來發現,可以避免這樣的重複進入佇列中,於是,就想著優化bfs,就變成了spfa,優化的量級還是可觀的,至少在我校oj上變成了rank1。才不給你們看我的user名稱呢 略略略 其實也可以看作網路流 就是單位流來做,但是沒必要,建單位流的邊去跑最段路,豈不是直接spfa...