ダイクストラ最短パスアルゴリズムは、出発点は、単一のフルパスアルゴリズムである、よく知られたアルゴリズムです。このアルゴリズムは、「貪欲法」サクセスストーリーとして知られています。この資料では、この偉大なアルゴリズムを紹介する次の最も人気のある言語を試み、Javaの実装コードを提供します。
まず、知識の準備ができて
図1は、図1のデータ構造を示す図です。
グラフを格納するために使用される様々なデータ構造があり、著者に使用されるアルゴリズムは、隣接行列です。
図ストレージ隣接行列は、図3の二つの配列によって表されます。情報メモリマップ頂点一次元アレイ、二次元アレイ(隣接行列)は、情報のグラフで弧またはエッジを保存しました。
n個の頂点を持つGを聞かせて、隣接行列は、として定義されるN×n個の正方行列です。
上記から分かるように、アレイは、無向グラフが対称行列であるエッジ。次数nのいわゆるマトリックスはAIJ = AJI対称行列要素を満足です。即ち、上部から軸は、主対角行列右下、左下隅と要素に対応する要素の右上隅に左全て等しいです。
この行列から、図の情報を知ることは容易です。
(1)任意の頂点は、2つのエンドレス面を有する非常に容易であるかどうかを決定します。
(2)頂点の程度を知ることは、実際には、頂点viと隣接行列または第i行(i番目の列)の要素。
(3)全ての隣接頂点viはiと走査再度行の行列要素である検索は、アーク[I] [j]は点に隣接しています。
図にストレスの程度ながら、頂点VIの程度は、1個、i番目の列との各々の正確数です。頂点VIの程度が2、すなわち、i行目とそれぞれの数です。
定義された図1と同様に、それはここでは繰り返さない、もあります。
図2に示すように、完全なパスのための単一の出発点
フルパスいわゆる単一出発点は、出発、すべてのノードへの最短パスの始点から図形を指します。
3、グラフ理論の基本的な知識(読者が自分で関連する情報を探しています)
図4に示すように、相補的な弛み状態
提供されるスカラD1、D2、...、dNは満たします
dj<=di + aij, (i,j)属于A,
そしてPは道路の端のための出発点としてIK I1があれば、あります
DJ =ディ+ AIJ、Pのすべてのエッジ(i、j)は
保持、Pは、IKのI1からの最短経路です。前記相補的な弛み状態は2つの式上で言及満足最短経路問題です。
アルゴリズムの第2、アイデア
1ので、G =(V、E)は、加重無向グラフです。G、もし2つの隣接ノード、iおよびj。iがjはノード間の(これ以降では下付き文字として表現、音符)AIJのアルゴリズムで距離として理解することができる、重量です。各ノードはそれへのルートの出発点からの距離を表す値DI(ノードフラグ)を有しています。
図2に示すように、未使用のアクセスノードのリストを格納するためのVアルゴリズムの初期配列は、我々は、仮候補リストと呼ばれます。ノード1は、開始ノードとして選択されます。すべてのノードのために、開始D1 = 0、ノード1、ノード他のディ=無限大、V。
Vが空集合である場合、初期条件の後、その後、停止するまで、反復アルゴリズムを開始します。具体的には、次の反復ステップ:
ノードd diの最小値は、候補リストから除去されます。(物品が導入される前に最小プライオリティキューを達成するために使用されるデータ構造がデキューされた本実施の形態では、Vは、好ましくは、実質的な性能のヒントフィボナッチ・ペアを使用します)。V(i、j)を含まない除去され、各エッジノードの開始ノードAに属する点で、DJ>ジ+ AIJは(弛緩状態に違反)、次いでせた場合
DJ =ジ+のAIJ、(jは最小距離が計算されたことを示す、Vから除去された場合、計算が関与していません)
アルゴリズムの作品に操作で見ることができ、ノードのD値が単調に成長していません
このアルゴリズムは、以下に示し
第三に、コードの実装
//接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
//返回一个int[] 数组,表示从start到它的最短路径长度
public static int[] Dijsktra(int[][]weight,int start){
int length = weight.length;
int[] shortPath = new int[length];//存放从start到各个点的最短距离
shortPath[0] = 0;//start到他本身的距离最短为0
String path[] = new String[length];//存放从start点到各点的最短路径的字符串表示
for(int i=0;i<length;i++){
path[i] = start+"->"+i;
}
int visited[] = new int[length];//标记当前该顶点的最短路径是否已经求出,1表示已经求出
visited[0] = 1;//start点的最短距离已经求出
for(int count = 1;count<length;count++){
int k=-1;
int dmin = Integer.MAX_VALUE;
for(int i=0;i<length;i++){
if(visited[i]==0 && weight[start][i]<dmin){
dmin = weight[start][i];
k=i;
}
}
//选出一个距离start最近的未标记的顶点 将新选出的顶点标记为以求出最短路径,且到start的最短路径为dmin。
shortPath[k] = dmin;
visited[k] = 1;
//以k为中间点,修正从start到未访问各点的距离
for(int i=0;i<length;i++){
if(visited[i]==0 && weight[start][k]+weight[k][i]<weight[start][i]){
weight[start][i] = weight[start][k]+weight[k][i];
path[i] = path[k]+"->"+i;
}
}
}
for(int i=0;i<length;i++){
System.out.println("从"+start+"出发到"+i+"的最短路径为:"+path[i]+"="+shortPath[i]);
}
return shortPath;
}
これはダイクストラ最短経路方法を使用して達成されます。
次に、例えば、定数を宣言することができます。
static final int MAX = 10000;
そして、mainメソッド内の隣接行列を構築するには、このメソッドを呼び出すことができます。
public static void main(String[] args) {
int[][] weight = {
{0,3,2000,7,MAX},
{3,0,4,2,MAX},
{MAX,4,0,5,4},
{7,2,5,0,6},
{MAX,MAX,4,6,0}
};
int start = 0;
int[] dijsktra = Dijsktra(weight,start);
}