続きスムーズな交通プロジェクト
制限時間:1000分の3000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):82186受理提出(S):31619
問題の説明
長年のプロジェクトの円滑な実施の州ので、最終的には多くの道路を造りました。しかし、もっと良い方法ではありません、1つの町から別のたびに、から選択する道路制度の多くの種類があり、そしていくつかのプログラムは、他のプログラム、他よりもはるかに短い徒歩圏内です。これは、歩行者が非常に問題を抱えたことができます。
さて、開始点と終了点が知られている、あなたは最短距離を歩くために必要などのくらいの、最初から最後まで計算します。
さて、開始点と終了点が知られている、あなたは最短距離を歩くために必要などのくらいの、最初から最後まで計算します。
入力
このトピックでは、複数のデータセット、ファイルの末尾に処理が含まれています。
各テストラインは2つの正の整数NとM(0 <N <200,0 <含ま M <1000)、 町の数を表し、既存の道路の数が構築されています。都市部では0〜N-1の番号が付けられています。
Mライン道路情報が続きます。各行は三つの整数A、B、X(0 <含ま = A、B <N、!= B、0 <X <10000)、 町や都市A B X双方向道路の長さの間に発現しました。
次の行は、二つの整数S、T(0 <= S、続いて 、T <N) の開始点と終了点を表します。
各テストラインは2つの正の整数NとM(0 <N <200,0 <含ま M <1000)、 町の数を表し、既存の道路の数が構築されています。都市部では0〜N-1の番号が付けられています。
Mライン道路情報が続きます。各行は三つの整数A、B、X(0 <含ま = A、B <N、!= B、0 <X <10000)、 町や都市A B X双方向道路の長さの間に発現しました。
次の行は、二つの整数S、T(0 <= S、続いて 、T <N) の開始点と終了点を表します。
出力
データの各セットに対して、最小の出力は、一本のライン上を歩くために必要。SからTへのルートは、-1の出力は存在しない場合。
サンプル入力
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
サンプル出力
2
-1
#include <iostreamの> する#include < 文字列・H> の#include < ストリング > の#include <アルゴリズム> の#include <キュー> の#define LL長いロング #defineする 0x3f3f3f3f MXを 使用して 、名前空間STD; INTウェイ[ 250 ] [ 250 ]、DIS [ 250 ]、VIS [ 250 ]、CNT [ 250 ]; // ウェイ記録パスの関係、DIS [i]の点jから最も近い距離を記録し、VIS [i]はキュー、CNT中のマーカーか[i]は、レコード点の数キューにI int型N-、M、 無効(INIT)を { ため(int型私は=0、I <N - 、I ++)// 初期化ウェイ { ため(INT J = 0 ; J <N-; J ++ ) { IF(I == J) ・ウェイ[I] [J] = 0 ; 他 ウェイ[I] [J] = MXが; } } } ボイド SPFAは(int型ST)を { ため(int型 I = 0、I <N - 、Iは++)// この点番号は0〜 DIS [I] = MX; のmemset(VIS、0、はsizeof(VIS))。 memset(CNT、0、はsizeof (CNT))。 VIS [ST] = 1 。 CNT [ST] = 1 。 DIS [ST]は = 0 。 キュー < 整数 > のp; p.push(ST); しばらく(!p.empty()) { int型になりました= p.front(); p.pop(); VIS [今] = 0 ; 以下のために(int型 i = 0 ; iがn <I ++の) { 場合(DIS [今] +方法[今] [i]は<をDIS [I]) { DIS [I] = DIS [今] + ウェイ[今] [I]; IF(VIS [I] == 0)// 点は内部キューにない場合 、{ p.push(I); VIS [I] = 1 ; CNT [I] ++ ; IF(CNT [I]> N)// この点は、負の環が直接返す示し、n回以上を追加する場合は リターン; } } } } } int型のmain() { int型、ST、エンド しばらく(〜scanfの(" %D%のD "、およびN-、&M))// 端に入力、またはTLE { INIT(); //は道を初期化 するための(int型 I = 0 ; Iがm <; Iは++ ) { int型のX、 Y、Z、 scanfの(" %D%D%D "、およびX&Y、およびZ); IF(ウェイ[X] [Y]> Z)// 複数のエッジ { ウェイ[X] [Y] = Z; 方法[Y] [X] = Z; } } scanfの(" %D%D"&ST、およびエンド); SPFA(ST); // SPFAは最短距離のそれぞれに開始点を得ることができる IF(DIS [終了] == MX) のprintf(" -1 \ N- " ); 他 のprintf(" %Dの\のN- " 、DIS [終了]); } 戻り 0 ; }