題意:bob現在有的錢數為k,他想從城市1到城市n,給出m條連線兩個城市的有向邊,並且給出路的長度w,和經過這條路要交的錢數c。問bob在花的過路費不超過k的前提下能到達城市n的最短路徑為多長。
思路:才開始我想spfa來做,開兩個陣列dis記錄距離最短disw記錄話費最小,在鬆弛的時候進行距離與費用的限制來進行,可是發現當某乙個點被多個點更新時,比如i點被更新為[7,12] [9,9] [12,7]
那我們選擇哪乙個呢?如果我們選擇路徑短的話,[7,12] 可是可能時間總和就會超出k,如果我們選擇費用小的話[12,7] 可是路徑的長度可能不如選擇[9,9]的短,所以無法做出選擇。
這裡我們用bfs來做,佇列用優先佇列實現,這裡有了兩個保證:1:bfs本身搜尋的過程就是找最值得過程,我們用它來實現費用最小;2:優先佇列每次出來的是路徑最小的那麼我們又得到了路徑最小的滿足。一舉兩得啊!!
#include #include#include
#include
#include
#include
#define maxn 107
using
namespace
std;
const
int inf = 0x7fffffff
;struct
node
h[maxn*maxn],*head[maxn];
//搜尋過程中的記錄
struct
nn};
intn,m,k,t,ans;
priority_queue
que;
void insert(int u,int v,int l,int
w)void bfs(int
s) node *q;
for (q = head[u.pos]; q ; q = q->next)}}
}int
main()
bfs(1);
if (ans != inf) printf("
%d\n
",ans);
else printf("
-1\n");
return0;
}
172 完美距離
聽說這題只用普通的線段樹就可以了,但我卻用了線段樹合併。也許蒟蒻對概念並不夠了解。注意n要定義為200000,因為環的處理要佔兩倍記憶體。考試的時候沒想清楚,一開始只得了三十分,後來悄悄看了成績後直接把n開到1000000把它a掉。事後直到現在才明白當時為毛re。如下 include include...
PKU 密碼翻譯
在情報傳遞過程中,為了防止情報被截獲,往往需要對情報用一定的方式加密,簡單的加密演算法雖然不足以完全避免情報被破譯,但仍然能防止情報被輕易的識別。我們給出一種最簡的的加密方法,對給定的乙個字串,把其中從a y,a y的字母用其後繼字母替代,把z和z用a和a替代,則可得到乙個簡單的加密字串。讀取這一行...
172 立體推箱子
此題是一道比較明顯但又麻煩的廣搜題,經典的走迷宮求最少步驟的題 由於這個題的狀態有些麻煩,我們建立乙個三元組結構體 x,y,li e x,y,lie x,y,l ie x,y x,yx,y表示座標,lie lieli e表示現在是立著的還是橫著躺或是豎著躺 l ie 0 lie 0 lie 0,表示...