背景
ヒューゴヘビーは幸せです。Cargolifterプロジェクトの内訳後、彼は今、ビジネスを拡大することができます。しかし、彼は本当に彼の顧客はすべての通りは重量を運ぶことができた上でそれが必要とされる場所に彼の巨大な鋼鉄のクレーンを構築しているところから道があるかどうかを彼に告げる賢い男を必要とします。
幸いなことに彼はすでに彼はクレーンがなることがどのように重い彼の顧客に伝えるために、最大重量容量を見つけるためにどのようにないアイデアを持っていないすべての道路や橋梁と都市の計画を持っており、すべての許可weights.Unfortunately。しかし、あなたはきっと知っています。
問題
あなたは、1からnまでの番号が付けられている交差の間に、(重量制限に)通りに記載都市計画を、与えられています。あなたの仕事は、交差点のn(顧客の場所)に1(ヒューゴの場所)と交差するから輸送することができる最大重量を見つけることです。あなたは、少なくとも一つの道があることを仮定してもよいです。すべての街は両方向に旅することができます。
ヒューゴヘビーは幸せです。Cargolifterプロジェクトの内訳後、彼は今、ビジネスを拡大することができます。しかし、彼は本当に彼の顧客はすべての通りは重量を運ぶことができた上でそれが必要とされる場所に彼の巨大な鋼鉄のクレーンを構築しているところから道があるかどうかを彼に告げる賢い男を必要とします。
幸いなことに彼はすでに彼はクレーンがなることがどのように重い彼の顧客に伝えるために、最大重量容量を見つけるためにどのようにないアイデアを持っていないすべての道路や橋梁と都市の計画を持っており、すべての許可weights.Unfortunately。しかし、あなたはきっと知っています。
問題
あなたは、1からnまでの番号が付けられている交差の間に、(重量制限に)通りに記載都市計画を、与えられています。あなたの仕事は、交差点のn(顧客の場所)に1(ヒューゴの場所)と交差するから輸送することができる最大重量を見つけることです。あなたは、少なくとも一つの道があることを仮定してもよいです。すべての街は両方向に旅することができます。
入力
最初の行は、シナリオ(都市計画)の数が含まれています。各都市のn通りの交差の数(1 <= N <= 1000)とストリートの数mの最初の行に示されています。次のm行は、通りの開始と終了交差点及び交差の各対の間に多くても1つの通りであるでしょう1000000より大きい正としない最大許容量を指定する整数のトリプルを含みます。
出力
、iは1から始まるシナリオの数はその後ヒューゴが顧客に輸送することができる最大許容量を含む単一の行を印刷である:すべてのシナリオの出力は、「シナリオ#I」を含む行から始まります。空白行とのシナリオの出力を終了します。
サンプル入力
1 3 3 1 2 3 1 3 4 2 3 5
サンプル出力
#1シナリオ: 4
の効果にnに1の最短辺重量の最大点を求めるのすべてのパスという。それはダイクストラ最適化されたスタックを介して実行することができます。dは異なるアレイおよび緩和操作の意味がどこにあるか異なっています。ここで、d [i]が1から最小経路側の代表的な最大の辺の重みにすべてのiについて。緩和条件を変化させた場合(D [Y] <分 (D [x]は、Z))D [Y] =分(D [x]は、Z)。
ことに留意されたい:
1.Dアレイが-INFに初期化されますD [n]はできるだけ大きく許容することを要求するからです。
INFを初期化する2.D [1]。D [1]は0、初期化をDijテンプレートによれば、第1の点1が取り出されている場合、この時間D [Y]は-INFであるため、分(D [x]は、Zよりも小さくなければならない )、 Dとして[X] Dへ最初に等しい[1]は、最終的に、アレイ全体をd 0、ではない答えであるように、0に等しいです。
そう、それはブルーブックによると、小さなルートスタックのようになることはできません、大きなを出すべき優先度キューためにマイナス記号なし2.pair最初の次元。
書式#include <iostreamの> の#include <cstdioを> する#include <cmath> の#include <アルゴリズム> 書式#include <ベクトル> の#include <CStringの> の#include <キュー> 使用して 名前空間をSTD。 CONST INT N = 10005、M = 200010。// 两倍存双向边 INT 版ヘッド[N]、[M]、エッジ[M]、次に[M]、D [N]。 BOOL V [N]。 整数 N、M、TOT = 0 。 PRIORITY_QUEUE <ペア< int型、int型 >> Q; 無効アドオン(int型X、INT Y、INT Z) { 版[ ++ TOT = Y、エッジ[TOT = Z、次に[TOT =頭部[X]、ヘッド[X] = TOT。 } ボイドダイクストラ() { memsetの(D、 - 0x3fを、はsizeof (d)参照)。 memset(V、0、はsizeof (V))。 D [ 1 ] = 2000000000 。 q.push(make_pair(20000000、1 ))。 一方、(q.size()) { int型のx = q.top()は、第2。 q.pop(); もし(V [X])続け; V [X] = 1 。 int型私は、 ため(I [x]はヘッド=; I;私は= 次に[I]) { int型、Y = 版[I]を、 INT Z = エッジ[I]; もし(D [Y] < 分(D [x]は、Z)) { D [Y] = 分(D [x]は、Z)。 q.push(make_pair(D [Y]、Y))。 } } } } int型のmain() { int型、T。 cinを >> トン。 int型I、J、K。 以下のために(iは= 1 ; iが<= T; I ++ ) { TOT = 0 。 一方、(q.size())q.pop(); memsetの(頭、0、はsizeof (ヘッド))。 memsetの(次に、0、はsizeof (NEXT))。 scanf関数(" %D%D "、&N、&M)。 用(J = 1 ; J <= Mであり、j ++ ) { int型のX、Y、Z。 scanf関数(" %D%D%D "、およびX&Y、およびZ)。 (x、y、z)を加えます。 (Y、X、Z)を追加します。 } ダイクストラ()。 printf(" シナリオ#%dの:\ N " 、i)は、 COUT << D [N] << ENDL。 coutの << てendl; } }