網路流24題 汽車加油行駛問題 題解

2021-10-05 11:43:48 字數 1647 閱讀 8627

題目傳送門

題目大意:有一張網格圖,起點為 (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...