變形最短路

2022-08-17 13:12:16 字數 1409 閱讀 1231

有沒有感覺神似 acmer的出行計畫

我們知道dijkstra是貪心策略的dp嘛,貪心的是距離

然而有時除了距離還有別的限制,在這裡是油。這時候花費最小不一定是最優,還要考慮剩餘的油

dp(i,j)表示到i點時剩餘j油時最少的花費

在乙個點可以選擇向下走(油夠的情況)或者加1份油(多次加乙份油就相當於加任意份油)

按照這樣的dp策略就可以ac

然後關於排重兩種寫法

一種是無腦入隊,出隊的時候查重

if

(vis[u][oil])

continue;

vis[u][oil] = 1;

還有一種是在入隊之前看一下是否重複

加油的 if(!vis[u][oil+1])和

走路的if(!vis[v][oil-w])

都能ac,不過居然是第一種快一些。。。

暫時不知道為什麼。。。【心碎】

#include#include

#include

using

std::priority_queue;

const

int maxn = 1e3+7, maxm = 1e4+7, size = 107, inf = 0x3f3f3f3f

;struct

edge

edge(

int v, int w, int

nxt):v(v), w(w), nxt(nxt){}

}e[2*maxm];

inthead[maxn], next[maxn], cur, mny[maxn], n, m, vol;

intvis[maxn][size], dp[maxn][size];

struct

state

state(

int u, int cost, int

oil):u(u), cost(cost), oil(oil){}

bool

operator

< (const state& tmp)const

};void addedge(int u, int v, int

w)void dijkstra(int st, int

ed)

if(oil+1

<= vol && dp[u][oil+1] > dp[u][oil] +mny[u])

for(int i = head[u]; ~i; i =e[i].nxt)}}

puts(

"impossible");

}int

main()

intq;

scanf("%d

", &q);

while(q--)

return0;

}

dij最短路 變形

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...

Arbitrage(最短路變形)

能否套利 sample input 3usdollar britishpound frenchfranc 3usdollar 0.5 britishpound britishpound 10.0 frenchfranc frenchfranc 0.21 usdollar 3usdollar brit...

最短路 記錄路徑 變形!!

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...