アルゴリズムの説明:
ダイクストラは、重み付き有向グラフ上の単一ソースの最短経路問題を解決します。アルゴリズムでは、すべてのエッジの重みが負でないことが必要です。
アルゴリズムが動作中に維持する重要な情報は、ノードセットSのセットです。ソースポイントsからセット内の各ノードへの最短経路が見つかりました。
アルゴリズムは、ノードセットVSから最短経路推定値を持つノードuを繰り返し選択し、uをセットSに追加してから、uから始まるすべてのエッジを緩和します。
アルゴリズムの実装:
dist配列は、図のソースポイントからノードまでの最短距離を記録します。初期距離は無限であり、アルゴリズムを開始するにはdist [start] = 0を設定します。
ノードuが集合Sに参加するとき、このパスのuの前兆はすでに集合Sになければなりません。
int edge [N] [N]; int dist [N]; //最短距離 int bset [N]; //マークがすでにセットにあるかどうかS int pre [N]; //先行する constを記録するint INF = 999999999; voidダイクストラ(開始) { fill(dist、dist + N、INF); fill(bset、bset + N、0); dist [start] = 0; for(int i = 0; i <N; i ++) { int min = INF; int u = -1; for(int j = 0; j <N; j ++) { if(bset [j] == 0 && dist [j] <min) { u = j; min = dist [j ]; } } if(u == -1)continue; bset [u] = 1; for(int j = 0; j <N; j ++) { if(bset [j] == 0) {
//緩和演算 if(dist [u] + edge [u] [j] <dist [j]) { dist [j] = dist [u] + edge [u] [j]; pre [j] = u; } else if(dist [u] + edge [u] [j] == dist [j]) { / /このノードへの複数の最短パスがあることを説明します } } } } }
アルゴリズムの正当性の証明:
重み付き有向グラフG =(V、E)では、Sは最初は空のセットです。
:私たちは、ことを示す必要があるため、それぞれにSがUであるセットのノードに参加し、距離が最短距離にuのです。
udをsからuまでの距離、δ(s、u)をsからuまでの最短距離とすると、次のことが証明されます。
上のノードに参加するそれぞれにおけるUはSである設定、UD =δ(S、U )
反証の証拠はここで使用されます:
仮説:ノードuは、ud≠δ(s、u)となるようにセットSに追加される最初のノードです。
ソースノードsは、セットSに追加される最初のノードであり、sd =δ(s、s)= 0です。ノードuは、ノードsとは異なる必要があります。つまり、u≠sです。
アルゴリズムによれば、uがSに追加されるとき、ノードsからuへのパスが存在する必要があり、uの前駆ノードはセットSにあり、これはP1として示されます。
仮定が理解することによって、のSにUから最ももある短いパスは、このパスは、Sを設定必ずしもUの前駆体ではない(さもなければ緩和プロセスは、パスを見つける)、パスはP2と呼ばれます。
現在、uはSに入れる必要があり、bはセットSの外側のノードです。
仮定から知る:xd =δ(s、x)
ad =δ(s、x)
P2 <P1、dist [b] <dist [u]を推定できるため、bがuの前に入ることになり、矛盾が生じます。