実際には、ネガティブパス環境でダイクストラのアルゴリズムを使用するアルゴリズムがあります。これは、すべての負のエッジを削除し、最初にグラフのバランスを取り直すことによって行われます。このアルゴリズムは「ジョンソンのアルゴリズム」と呼ばれます。
それが機能する方法は、グラフ内の他のすべてのノードにトラバースするためのコストが0の新しいノード(たとえばQ)を追加することです。次に、ポイントQからグラフ上でベルマンフォード法を実行し、Qに関する各ノードのコストを取得します。これをq [x]と呼びます。これは、0または負の数(負のパスの1つを使用したため)になります。 )。
たとえば、a-> -3-> bであるため、これらすべてのノードにコストが0のノードQを追加すると、q [a] = 0、q [b]=-3になります。
次に、次の式を使用してエッジのバランスを取り直します。重み+ q[ソース]-q[宛先]したがって、a->bの新しい重みは-3+ 0-(-3)=0です。他のすべての場合にこれを行います。グラフのエッジを削除してから、Qとその出力エッジを削除して出来上がり!これで、ダイクストラ法を実行できる負のエッジのないリバランスされたグラフができました。
実行時間は、O(nm)[ベルマンフォード] + nx O(m log n)[nダイクストラ法] + O(n ^ 2)[重み計算] = O(nm log n)時間です。
詳細:http://joonki-jeong.blogspot.co.uk/2013/01/johnsons-algorithm.html