裝滿的油箱(最短路變式)

2022-03-29 15:10:39 字數 1769 閱讀 3718

有n個城市(編號0、1…n-1)和m條道路,構成一張無向圖。

在每個城市裡邊都有乙個加油站,不同的加油站的單位油價不一樣。

現在你需要回答不超過100個問題,在每個問題中,請計算出一架油箱容量為c的車子,從起點城市s開到終點城市e至少要花多少油錢?

輸入格式

第一行包含兩個整數n和m。

第二行包含n個整數,代表n個城市的單位油價,第i個數即為第i個城市的油價p

i'>pi

pi。接下來m行,每行包括三個整數u,v,d,表示城市u與城市v之間存在道路,且車子從u到v需要消耗的油量為d。

接下來一行包含乙個整數q,代表問題數量。

接下來q行,每行包含三個整數c、s、e,分別表示車子油箱容量、起點城市s、終點城市e。

輸出格式

對於每個問題,輸出乙個整數,表示所需的最少油錢。

如果無法從起點城市開到終點城市,則輸出」impossible」。

每個結果佔一行。

emmmmm, 算是最短路的乙個變式吧, 這道題並不問你到達終點的最短路, 而是問你到達終點時花費最少的油錢, 很容易和我們最短路的演算法dijkstra聯絡在一起, 將花費的價錢加入優先佇列中, 當第一次彈出終點時, 此時的花費即為最少花費。我們可以想到, 用乙個二維陣列來記錄,到哪個點, 剩下多少油的最小花費為dis[x][c],x是城市的編號, c是剩下的油量。如果c < c, 我們可以拓展乙個新的狀態dis[x][c + 1] = dis[x][c] + p[x], 並把它加到佇列中, 而我們從乙個城市到達另乙個城市時, 又有乙個新的狀態dis[next][c - v] = dis[x][c], 這樣我們跑一遍dijkstra就行了。

#include using

namespace

std;

typedef

long

long

ll;const

int inf = 0x3f3f3f3f

;const

int maxn = 2e5 + 100

;const

int maxm = 1e3 + 10

;template

< typename t > inline void read(t &x)

while

(isdigit(ch))

x *=ff;

}template

< typename t > inline void

write(t x)

intn, m, t, c, s, t;

intp[maxm], dis[maxm][maxm], vis[maxm][maxm];

int lin[maxn], tot = 0

;struct

edge e[maxn];

struct

node

};inline

void add(int xx, int yy, int

vv)

intbfs() );

dis[s][

0] = 0

;

while(!q.empty()) ); }}

for(int i = lin[xx], y; i; i =e[i].next) );}}

}}

return -1;}

intmain()

for(int i = 1; i <= m; ++i)

read(t);

while(t--)

return0;

}

37 最短路的變式(這裡求最長路)

小w不會離散數學,所以她van的圖論遊戲是送分的 小w有一張n個點n 1條邊的無向聯通圖,每個點編號為1 n,每條邊都有乙個長度 小w現在在點x上 她想知道從點x出發經過每個點至少一次,最少需要走多少路 第一行兩個整數 n,x,代表點數,和小w所處的位置 第二到第n行,每行三個整數 u,v,w,表示...

01揹包變式 要求恰好裝滿的01揹包

ktv裡面有n首歌曲你可以選擇,每首歌曲的時長都給出了.對於每首歌曲,你最多只能唱1遍.現在給你乙個時間限制t t 10 9 問你在最多t 1秒的時間內可以唱多少首歌曲num 且最長唱歌時間是多少time time必須 t 1 最終輸出num 1 和 time 678 即可.注意 你需要優先讓歌曲數...

最短路 求最長最短路,求最短路的路徑

hdu 1595 find the longest of the shortest include include include include include include include include include include include include include defi...