HDU 1874は妨げられることなくエンジニアリング(SPFAテンプレートを)続け

続きスムーズな交通プロジェクト

制限時間: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) の開始点と終了点を表します。
 

 

出力
データの各セットに対して、最小の出力は、一本のライン上を歩くために必要。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 ; 
}

 

おすすめ

転載: www.cnblogs.com/-citywall123/p/11324215.html
おすすめ