問題の説明
数字1 ... Nと名付けN都市は片道道路に接続されています。道路の長さ(コインの数で表される)道路のために支払われる必要が有料:各道路は、それに関連付けられた2つのパラメータを有しています。ボブとアリスはアリスは、彼らが遊ぶのが好きなカードゲームに浮気されたことに気づいた後、市内1に住んで、ボブは彼女と別れたと離れて移動することを決めた-彼はそこに取得したい都市Nに早くとして可能性が、彼は現金が不足しています。
我々は見つけるために、ボブを助けたい の最短経路を 街のN市内1から 彼は余裕ができ 、彼が持っているお金の量に。
我々は見つけるために、ボブを助けたい の最短経路を 街のN市内1から 彼は余裕ができ 、彼が持っているお金の量に。
入力
入力の最初の行は、整数K、0 <= K <= 10000、ボブは、彼の方法で過ごすことができるコインの最大数を含んでいます。2行目は整数N、2 <= N <= 100、都市の総数を含んでいます。
第三のラインは、整数R、1 <= R <= 10000、道路の総数を含んでいます。
次のRラインの各々は、S、D、LおよびTは、単一の空白文字で区切られた整数を指定することにより、1本の道路を示します。
第三のラインは、整数R、1 <= R <= 10000、道路の総数を含んでいます。
次のRラインの各々は、S、D、LおよびTは、単一の空白文字で区切られた整数を指定することにより、1本の道路を示します。
- Sは、元の都市、1 <= S <= Nであります
- Dは、目的地の都市、1 <= D <= Nであります
- Lは、道路の長さであり、1 <= L <= 100
- Tが有料である(コインの数で表される)、0 <= T <= 100
出力
第一及び出力の唯一のラインは、全トール以下K硬貨ある都市N市内1からの最短経路の長さの合計を含むべきです。そのようなパスが存在しない場合は、唯一の数が-1出力に書き込まなければなりません。
サンプル入力
5
6
7
1 2 2 3
2 4 3 3
2 3 4 4
1 3 4 1
4 6 1 2
3 5 0 2
5 4 3 2
サンプル出力
11
************************************************** *******************************************
最短経路を見つけるためのアルゴリズムspfa
************************************************** *******************************************
1の#include <iostreamの> 2の#include < ストリング > 3の#include <CStringの> 4の#include <キュー> 5 使って 名前空間STDを、 6 構造体の 縁 7 { 8 int型RP、LEN、ワスト、次。 9 } E [ 10111 ]。 10 構造体 ポイント 11 { 12 のint SP、LEN、ワスト。 13 ブール 演算子 <(constの 構造体の c点)CONST // 重载运算符 14 { 15 IF(LEN == c.len) 16の リターン c.wast < WAST; 17 リターン c.len < LEN、 18である } 19 } P1、P2、 20は INT totalmoney、ヘッド[ 1001 ]、NUM、DIS [ 1001 ] numcity、numpathは、I、J、 21は 空隙追加(int型の Xは、int型 Y、int型 LL、int型 V)を// 前スター側鎖に添加する 22である { 23で RP = E [NUM]。Y、 24 E [NUM] = .LEN LL; 25 E [NUM] .wast = V; 26である E [NUM] = .next ;頭部[X] 27の ヘッド[X] NUM = ++ ; 28 } 29 PRIORITY_QUEUE <ポイント> QQ; 30 空隙 SPFA()//のソースを見つけます各サイドから 31である { 32 ながら(!qq.empty()) 33である )qq.pop(; 34である p1.sp = 1 ; p1.len = 0 ; p1.wast = 0 ; 35 qq.push(P1)。 36 ながら(!qq.empty()) 37 { 38が P2 =qq.top(); 39 であれば((p2.sp)== numcity) 40 { 41 COUT << p2.len << ENDL。 42 リターン; 43 } 44 qq.pop()。 45 のために(int型 I =ヘッド[(p2.sp)]; I =! - 1 ; I = E [I] .next) 46 { 47 のint Y = E [I] .rp。 48 であれば(p2.wast + E [i]を.wast <= totalmoney) 49 { 50 p1.len = p2.len + E [i]の.LEN。 51 p1.wast = p2.wast + E [I] .wast。 52 p1.sp = Y。 53 qq.push(P1)。 54 } 55 } 56 57 } 58 COUT << " -1 " << ENDL。 59 リターン; 60 } 61 のint main()の 62 { 63 CIN >> totalmoney。 64 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 65 CIN >> numcity >>numpath; 66 NUM = 0 。 67 int型のx、y、LL、V。 68 のためには、(int型 I = 1 ; I <= numpath; iは++ ) 69 { 70 CIN >> X >> Y >> LL >> V。 71 (X、Y、LL、V)を加えます。 72 } 73 spfa()。 74 リターン 0 ; 75 }
ます。https://www.cnblogs.com/sdau--codeants/p/3317606.htmlで再現