単一ソースの最短経路アルゴリズムのダイクストラ

アルゴリズムの説明:

    ダイクストラは、重み付き有向グラフ上の単一ソースの最短経路問題を解決します。アルゴリズムでは、すべてのエッジの重みが負でないことが必要です。

    アルゴリズムが動作中に維持する重要な情報は、ノードセット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の前に入ることになり、矛盾が生じます。

    

おすすめ

転載: www.cnblogs.com/yanghh/p/12685278.html