貪欲な最短経路アルゴリズム

// プログラム2-4 
の#include <iostreamの> 
する#include <WINDOWS.H> 
の#include <スタック>
 使用して 名前空間STD;
 のconst  int型 N = 100 ; // 都市の数が変更されてもよい
のconst  int型 INF = 1E7; // 無限10000000 
INTマップ[N] [N]、DIST [N]、P [N]、N-、M; // のN-都市数、mは都市間の経路の数がストリップである
BOOLを [N]フラグに; // の場合[i]が真と等しい、頂点I記述は集合Sに追加された、そうでない場合、iは頂点の集合に属するVS 
無効ダイクストラを(INT U)
{ 
   ためint型のI = 1 ; I <= N; iは++  
    {
     DIST [I] =マップ[U] [I]; // uは互いに頂点への最短経路長をソース初期化 
     フラグ= [I]でfalseにIF(DIST [I] == INF)
       Pを[I] = - 1 ; // 路長とソース頂点のu iとuのソース頂点に隣接していないことを示す、無限大である
     他の
       P [I] = U; //は、頂点を記載U i及びソース点に隣接し、設定された頂点I前駆物質P [I] = U 
    } 
    DIST [U] = 0 ; 
    フラグ[U]に = trueに ;    // 最初に、集合Sにおける唯一の要素:ソースU 
       
    ためINT I = 0、I <N - 、++ I)
    {     
        int型のTEMP = INF、T = U;
         のためのINT J = 1。 ; J <= N; J ++)// Uは、最も近い頂点tをVSに設定された距離源シーク
          IF(フラグに[J] && DIST [J] <!TEMP )
           { 
            T = J; 
            TEMP = DIST [J]; 
           } 
        IF(T == U)リターン ; //はTを見つけることができない、ループの外 
        フラグに[t]は= trueに// そうでない場合は、Tを設定するために添加される
        ためINT = J 1、Jは<= N; J ++)// ソース点Uの距離に隣接する頂点をtに更新
          IF(フラグ[J] &&マップ[T] [J]で<!INF)
             IF(DIST [J]>(DIST [T] + マップ[T] [J]))
             { 
               DIST [J] = DIST [T] + マップ[T] [J]。
               P [j]は = Tと、
             } 
    }        
} 
ボイド findpath(INT U)
{ 
  int型のX。
  スタック < int型 > S; 
  裁判所未満 << " 源点为:" << U << てendl;
  以下のためにint型 i = 1 ; iが++; iが<= N 
  { 
    X = P [i]は、
    同時に! - (X = 1
    { 
      S.push(X); 
      X = P [X]; 
    } 
    COUT << " 各頂点のような他のソースの最短パス:" ;
     ながら(!S.empty())
    { 
      COUT << s.top( )<< " - " ; 
      s.pop(); 
    } 
    COUT << << I " ;最短距離である:" << DIST [I] << ENDL; 
  } 
} 

int型のmain()
{ 
        int型U、V、 W、ST; 
        システム(" 色0D ");
        coutの << "都市の数を入力してください:" ; CIN >> <<てendl N-を、
        COUTを << " 都市間のルートの番号を入力してください:" <<てendl; CIN >> メートル; 
        COUT << " してください入力ラインと都市間距離:" << ENDL;
         のためのINT I = 1 ; I <= N; I ++ のためのINT J = 1 ; J <= N; J ++ 
          { 
             マップ[I] [J] = INF。// 隣接行列無限の初期化
          }
         ながら(M--を
        {
            CIN  >>U >> V >>W; 
            マップ[U] [V] =分(地図[U] [V]、W); // 隣接行列ストレージ、最小距離保持する
        } 
        COUT << " ボブの場所を入力してください。" << ENDLを;; 
        CIN >> ST、
        ダイクストラ(ST); 
        COUT << " 位置ボブ:" << ST << ENDL;
         のためのint型私は= 1 ; I <= N-Iは++ 
        { 
             COUT << ボブ:" << << ST "- " << ":新しい場所へ<< I;
              IF(DIST [I] == INF)
               COUT << " 申し訳ありませんが、決してアップ" << ENDL;
              他の
               COUT << " の最短距離である:" << DIST [I] << ENDL; 
         } 

         FindPath(ST); 
         戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/xjyxp/p/11330858.html