有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 usingnamespace
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...