説明するシナリオでは、ダイクストラのアルゴリズムは問題なく機能します。
一般的なケースで負の重みで失敗する理由は、各ステップで「閉じる」ノードを貪欲に選択し、閉じたノードが再び開かれることはないためです。
ここで、ソースが異なるノード
に対してエッジをs
持っていると仮定します。それらの順序を(最小にする)とします。それぞれについて、 - 「より良い」コストでからへのパスがないため、-これらの最初のノードを調査する順序は決して変わらないことに注意してください。(そしてそれは変わらないので、最短経路が実際に見つかる前に、後のノードが「閉じられた」状態になることはありません)。k
k
v_1, v_2, ..., v_k
v_1
v_i
v_j
i < j
s
v_i
v_j
v_i
したがって、全体として、害はありません。エッジが「閉じた」状態になると、負のエッジはソースからのみであるため、エッジへの「短い」パスは見つかりません。
ここでは、DAGの「ソース」と同じように、
source
あなたの質問の意味を想定しています。ソース頂点の外を意味する場合は、2つの頂点のグラフを見て、グラフに負のサイクルがあるため、問題になる可能性があります。したがって、上記の説明が機能するためには、d_in(source)=0
w(s,t) = -2, w(t,s)=1
d_in(s) = 0