ここでは、見つけたアルゴリズムがあなたの問題の例をどのように処理するかについて説明します。
問題は、途中の累積コストが7
より大きくならないように、node one
とnode four
の間の最短経路を見つけることです。
node one
からノードnode two
までの距離、190
の距離、および4
のコストです。距離195
とコスト3
のパスを使用してnode two
からnode four
に移動します。合計で、パスは385
の距離と7
のコストを持ちます。
ステップ1
それでは、どのようなアルゴリズムは、これを見つけるのですか?最初のステップは、あなたがやったように、マトリックスminArray(i,j)
を設定することです。配列の(i,j)
要素は、ノードj
に到達するために移動する必要がある距離を正確にi
の金額で保持します。そこからスタート
何の要素を訪問されていないと我々は左上の要素がゼロに設定されている7
「金銭」とnode one
から開始されているからです。上の表の空白は、配列内のinfinity
に設定されている値に対応しています。
ステップ2
次に、我々は、アレイの最小値を見つけ、これは位置(remaining money, node) = (7,1)
にゼロです。この要素はvisited
に設定されています(要素の状態はminArray
と同じサイズの行列visitedArray
を使用して追跡されます)。つまり、node one
が選択されています。 node one
に接続するすべてのノードは、対応するエッジをトラバースすることによって値で更新されます。我々はそこに着くために1
のコストを払っておりますので、我々はnode three
に到達するために191
の距離を行っているし、我々が残っているお金が6
であることを意味
ここ
minArray(6,3) = 191
。同じようにminArray(3,2)
は190
に設定されています。赤い四角は、要素(7,1)
が訪問したことを示しています。
ステップ3
今、私たちは再び、(minArray(3,2) = 190
ある)最低未訪問の要素を見つけるvisited
にそれを設定し、それに接続するすべての要素を更新。これは、距離が累積され、残りの金額が現在の値からコストを差し引いて計算されることを意味します。
node two
から戻ってnode one
に行くにはあまりにも高価であることに注意してください。 minArray(6,3) = 191
を選択
ステップ4
次のステップは、次のようになります。
ステップ5
3つのステップ以降の配列は次のようになります。ここでは、382
に等しい要素と383
に等しい要素が選択されています。要素の値は、それが現在の値の改善(すなわち、より低い)である場合にのみ更新されることに留意されたい。
ステップ6
配列は、すべての要素がいずれかの訪問または静止無限大値を有するまで充填し続けます。
最終工程
最後のステップは、4列の最小値を見つけることによって、総距離を見つけることです。最小値のminArray(0,4) = 385
が正しい解に対応していることがわかります。
注:列4の値がすべて無限であった場合は、有効な解決策がないことを意味します。このアルゴリズムはまた、列4に等しい距離と最小距離の複数の値がある場合、最も安いものが選択されることを指定する。
パラレルエッジでダイクストラが破られることはありませんが、追加条件が適用されます。 –
それは正確な重複ですが、元の質問には解決策がありません - ソリューションは他の場所に存在するという声明だけです(そしてSPOJの815人がそれを見つけました)。 – LSerni
これは正確な重複ではありません。もう1つの質問は、ノードのペア間に2つ以上のパスが存在する可能性も、裾に付加される余分な条件もないということさえ全く言及していません。 –