参照用Dijstraアルゴリズムコード:
#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <iostreamの> に#define Infの0x3f3f3f3f 使用して 名前空間STD; int型マップ[ 1005 ] [ 1005 ]; // ストア入力配列値が int型 [VISを1005 ]、DIS [ 1005 ]; // VISタグアレイ、DIS最短経路 INT N-、M; // N点、Mエッジが 無効初期化() { memsetの(マップ、Infを、はsizeof(マップ)); //は、アレイマップ初期化 のためには(int型私は= 。1; I <= N; Iは++ ) { マップ[I] [I] = 0 ; } // ノードの値に右ノードが0に設定され、スラッシュ0のアレイに設定され、すなわち値 } ボイドGetMapリクエスト() { int型U、V、W; のための(INT T = 1 ; T <= M; T ++ ) { scanfの(" %D%D%D "、&U&V、およびW); // 入力配列は点の添え字をランク付け重量 IF(MAP [U] [V]> W)// 初期化マップ[] []配列値現在の入力の優先順位値よりも大きい(init関数が無限大に設定されている)場合 、{ マップ[U] [V] = W; 地図[V] [U] = W。 } } } 無効となり、ダイクストラ(INT U)// のためのノード動作 { memsetの(VIS、0、はsizeof(VIS))// VIS空の配列 のために(INT T = 1 ; T <= N; T ++ ) { DISを[ T] =マップ[U] [T]; //は、DISアレイが最短経路の重みを格納する第1の列の地図がDISの配列から値を格納 } VIS [U] = 1 ; // 配列は反対VIS N 1、配列タグのノードの重み値は、代表者が訪問している // 二重ループが最短経路を探している ため(INT T = 1 ; T <N-; T ++ ) { のIntミネソタ州= Infを、TEMP; // 変数minを定義するには無限である ため(INT I = 1は、 Iが<= N-; I ++の)は { IF!(VIS [I] && DIS [I]が<ミネソタ州)// 訪問しませんノードと記憶最短経路この時点でDISアレイは、重量ミネソタ州未満である { ミネソタ州 = DIS [I]; // DISアレイ重みにミネソタ変数格納されているポイント値の更新に TEMP = Iを; // 配列を更新添字 } } VIS [TEMP] = 1 ; // タグは、サイトを訪問している ため(INT I = 1。 ; I <= N; I ++は) { IF(マップ[TEMP] [I] + DIS [TEMP] <DIS [I])// 重量もし現在ノード+現在の右右の最短経路のノードに格納され、前のノード値未満の累積値 { DIS [I] =マップ[TEMP] [I] + DIS [TEMP]; // 重量ノードを更新する前 } } } } int型のmain() { scanfの(" %Dの%のD "、&M、 &N-); 初期化(); GetMapリクエスト(); ダイクストラ(N-); のprintf(" %Dの\のN- "、DIS [ 1 ]); // 他の単一始点最短経路点に対して印刷配列の添字1 リターン 0 ; }
ダイクストラ法の主なアイデア:
マップは、アレイ、VISタグアレイ、DIS格納最短経路長を初期化します
コアコード:
用(INT T = 1 ; T <N-; Tは++ ) { int型ミネソタ州= Infを、TEMPを; //が変数minを定義が無限大である ため(INT I = 1 ; I <= N-Iが++ ) { IF!(VIS [I] DIS && [I] <ミネソタ州)が// ノードにアクセスしないと最短経路を記憶することは、この時点でDISアレイは重量ミネソタ州未満である { ミネソタ州 = DIS [I]; // DISアレイ重みにポイント値を更新します格納された変数ミネソタ州 ; TEMP = I // 更新配列の添字 } } VIS [TEMPは] = 1 ; // タグは、サイトを訪問している ため(INT I = 1 ; I <= N; I ++は) { IF(MAP [TEMP] [I] + DIS [TEMP] <DIS [I])// 重量現在のノードであれば+最短パス現在のノードを格納します重量および累積ポイント値は、前のノードの重み未満である { DIS [I] =マップ[TEMP] [I] + DIS [TEMP]; // 右ノードの値の前に更新 } } }
同様の素数アルゴリズム、対象物ダイクストラアルゴリズムは有向グラフまたは無向グラフであり、それは単一始点最短経路(ポイント・ツー・ポイントの残りの部分への最短パス)を見つけることができ、時間複雑度はO(n個の* n)です。
違い:
核となるアイデアは、接続パスを更新して、プライムは、最小スパニングツリーエッジの次のノードに追跡されている次のノードにダイクストラトラックと交差するが、あります
すべてのノードとの出発点を通るパス。