最短(Dijstra)

問題の説明
毎年恒例の学校の競争では、すべての学生のファイナリストは非常にいいTシャツを受け取ることになります。衣料品の作品の何百ものスタッフが店からスタジアムに戻って出荷された時はいつでもしかし、彼らは非常に疲れているとき!だから今、彼らはあなたがそれらを助けることができ、店舗からスタジアムへの最短ルートを見つけたいですか?

 

入力
入力データの複数のセットを含みます。各二つの整数N、M(N <= 100の第1行 、M <= 10000)、Nは成都、符号1は、交差点の位置、N指定交差点を格納するいくつかの通りの交差点を表します競技場の場所があり、Mは、成都の選択肢のカップルを示しています。Nは= M = 0は、入力の終了を示します。次のM行、三つの整数A、B、C(1 <含む各行 = A、B <= N、1 <= C <= 1000)、 我々は、交点Aと交点Bとの間の経路があることを示しC-分の時間にスタッフの必要性は、この道を旅しました。
店舗への少なくとも1つのトラックの存在を確実にするために、入力ライン。
 

出力
各入出力ラインに対して、トラック労働者がストア最小時間から来る表します
 

サンプル入力
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 

サンプル出力
3 2

 

波にhttp://acm.hdu.edu.cn/showproblem.php?pid=2544のコード

 

#include <ビット/ STDC ++。H> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
する#include < ストリング > 
の#include <CStringの> 
する#include <cstdlib> 
の#include <地図> 
の#include <ベクトル> 
#含める < セット > 
の#include <キュー> 
の#include <スタック> 
の#include <cmath> 
typedefの長い 長いLL。
使用して 名前空間はstdを、
const  int型 INT = 1E6 + 5 LSONのRT << 1、L、M  
 の#define rsonのRT << 1 | 1、M + 1、R用
 の#define読み取る(X)のscanf( "%dの"、およびX)
 の#define LREAD(X)のscanf( "%のLLD "、&バツ);
#define PT(X)のprintf( "%d個の\ n"、(X))
 の#define CN CIN >>
 の#define CT COUT <<
 の#define EN << ENDL
 の#define担当者(J、K)のための式(I = int型(INT)〜(j)は、iが<=(INT)(K); I ++)
 の#define MEM(S、T)のmemset(S、T、はsizeof(複数可))
 の#defineリターン0を再。
文字列 STR1 = " CC "、STR2 = " PC "、STR3 = " PP "" ;
 INT DP [ 101 ] [ 101 ]、DIS [ 101 ]、使用[ 101 ];
 int型M、N、X、Y、Z、
 無効Dijstraを()
{ 
    MEM(使用、0 ); 
    担当者(1、N) DIS [i]はDP [= 1 ] [I];      // 距离初始化 
    DIS [ 1 ] = 0 ; 
    担当者(1 、N)
    { 
        int型のインデックス、mindis = INT;
         のためにINT J = 1 ; J <= N。 J ++ 
        { 
            場合(!使用[J] && DIS [J] < mindis)
            { 
                インデックス = J。
                mindis = DIS [J]。
            } 
        } 
        [インデックス]を用い = 1 INTの J = 1 ; J <= nであり、j ++ 
        { 
            場合(DIS [インデックス] + DP [インデックス] [J] < DIS [J])
                DIS [J] = DIS [インデックス] + DP [インデックス] [ J]; 
        } 
    } 
    CT DIS [n]のアン。
} 
ボイドのinit()
{ 
    一方(CIN >> N >> M &&(N && M))  // N-M点縁
    {
         IF(N - == 1){CT 0 EN; 続行;} 
        
        // 重量は、初期最大化
        するためにINT I = 1 ; I <= N-I ++ のためのINT J = 。1 ; J <= N; J ++ 
                DP [I] [J]は、 = INTを;
         // 重量初期 
        REP(1 、M)
        { 
            CIN >> X >> Y Z;
             IF(DP [X] [Y ]> Z)
                DP [X] [Y]= DP [Y] [X] = Z; 
        } 
        Dijstra()。
        / * 
        担当者(1、N)
            のための(INT J = 1; J <= N; J ++)
                DP [I] [j]はDP [J] [I] = I ^ jは=。
        * / 
    } 
} 
int型のmain()
{ 
    INIT()。
}
コードの表示

 

-----------------------------------------------セパレータ - ---------------------------------------

 最短は、データ範囲に注意を払うとのポイントを最適化する必要があります(追加)  

1.floydアルゴリズム一般的に使用される単語隣接行列演算(すぎない行列初期化データ)

 

2.dijkstraアルゴリズムは、その後一緒にヒープを最適化し、それはプライオリティキューです(ヒーププラスマップ場合は、削除操作がより速くなるでしょう増加)

  (もしあれば)n個の点を有するように適合され、図Mのエッジは、始点Sが与えられると、最短経路は、互いの到達点を決定することができます

 

3.SPFAアルゴリズムは、嵐に力全体の検索緩和、良い心を最適化BE、本質的には、非常に高速書き込みます。利用できません発散ビューのトレリス線図など 

 

-----------------------------------------------セパレータ - ---------------------------------------

 

Dijstra一般的な考え方は、アルゴリズムを使用することです:

1)主な役割を最大化するために(パスを最大にする)、存在しない道路の一部をスクリーニングすることです

2)パス入力の存在は、初期化し、すべての未訪問の点光源と直接距離(各点にDIS貯蔵源)のDIS []配列記憶された各点までの距離を

Dijstraのコアコード

3)一点判定ずつ、各点光源からの最短距離を見つけ、そしてポイントの状態を更新します

4)!(黒板にノック)

           もし(DIS [インデックス] + DP [インデックス] [J] < DIS [J])
                  DIS [J] = DIS [インデックス] + DP [インデックス] [J]。

最短距離を更新

 

上記の手順と併せて以下の図は、よりよく理解されるであろう(ブーイング!!!の図は、他の誰かのではなく、静かです)

 

 

 

 

 

 

 

1)エッジの重量に対して
2)最適化スタック

 

 

 

 

 

 

 

問題の説明
毎年恒例の学校の競争では、すべての学生のファイナリストは非常にいいTシャツを受け取ることになります。衣料品の作品の何百ものスタッフが店からスタジアムに戻って出荷された時はいつでもしかし、彼らは非常に疲れているとき!だから今、彼らはあなたがそれらを助けることができ、店舗からスタジアムへの最短ルートを見つけたいですか?

 

 

入力
入力データの複数のセットを含みます。各二つの整数N、M(N <= 100の第1行 、M <= 10000)、Nは成都、符号1は、交差点の位置、N指定交差点を格納するいくつかの通りの交差点を表します競技場の場所があり、Mは、成都の選択肢のカップルを示しています。Nは= M = 0は、入力の終了を示します。次のM行、三つの整数A、B、C(1 <含む各行 = A、B <= N、1 <= C <= 1000)、 我々は、交点Aと交点Bとの間の経路があることを示しC-分の時間にスタッフの必要性は、この道を旅しました。
店舗への少なくとも1つのトラックの存在を確実にするために、入力ライン。
 

 

出力
各入出力ラインに対して、トラック労働者がストア最小時間から来る表します
 

 

サンプル入力
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 

 

サンプル出力
3 2

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11410069.html