2016-05-28 7 views
5

負の重みを持たない重み付き無向グラフですが、頂点と自己ループの間に複数のエッジを含むことができる場合は、問題なしでDijkstraアルゴリズムを実行して、または目的地があるか、または反例が存在するか? graph並列エッジと自己ループを持つDijkstra

私の推測では、問題はないと確信しています。

+0

答えたように、それは本当にdijkstraアルゴリズムの特定の実装に依存します。 [こちら](https://www.quora。最も単純で効率的なC%2B%2B-code-for-Dijkstras-最短パスアルゴリズム/答え/ Michal-Fori%C5%A1ek?srid = ojqI)の実装は正常に動作しますすべての可能な平行エッジの中で可能な最小のエッジを、使用されているデータ構造に追加して、まだ探索されているノードを追跡するためです。 – thebenman

答えて

4

Dijkstraのアルゴリズムをグラフに変更せずに実行する場合は、ではなく、がソースとデスティネーションの最短経路を取得する可能性があります。

たとえば、SとOを考えてみましょう。最短パスを見つけることは、Oをキューにプッシュしたいときに、どのエッジが横断されているかによって異なります。コードがウェイト1でエッジを選択した場合は、問題ありません。しかし、コードがウェイト8でエッジを選択すると、アルゴリズムが間違った答えを与えることになります。

これは、アルゴリズムの正確さが、送信元ノードの隣接リストに入力されたエッジの順序に依存するようになったことを意味します。

+1

重要なことは動作するかどうかはアルゴリズムのプロパティではなく、実装のプロパティです。 – biziclop

2

グラフは、シングルエッジループや平行エッジのないグラフに簡単に変換できます。

シングルエッジループの場合、重量が負であるかどうかを確認する必要があります。ウェイトが負の場合、明らかに最短パスはありません。スピンを維持し、パスの長さを制限を超えて減らすことができます。しかし、ウェイトが正の場合、そのエッジを通過できる最短経路がないので、そのエッジを投げることができます。

ゼロウェイトエッジは、ゼロウェイトループと同様の問題を引き起こします。同じループを何度も繰り返し実行する最短パスは無限にあります。このような場合には、もう一度グラフからエッジを取り除くことが賢明です。

平行なエッジのうち、最も軽いもの以外のものをすべて捨てることができます。この理由は同じように簡単です。最短パスがある場合は、Aのエッジが平行で、ウェイトが小さいBの場合は、ABに置き換えるだけで、さらに短いパスを構築できます。したがって、最短経路はAになることはできません。

+0

よかったです。しかし、私の質問です:Dijkstraアルゴリズムを変更せずにグラフ上で実行すると、問題が発生する可能性がありますか? – Manuel

+1

@Manuelそれは完全に実装に依存します。たとえば、ノードNからすべての隣接ノードまでの距離を計算するステップでは、実装は、「N」からのすべての出力エッジが別のノードにつながると想定することができるので、ノードキーです。その場合、平行なエッジは簡単に間違った結果につながります。 – biziclop

1

わずかな変更が必要です。そこからUVに向かう複数のエッジがあり、各エッジがどちらかでき、異なる重みを有する場合:

  1. を緩和するための少なくともエッジに重みを選び、または
  2. 各エッジの緩和を実行します。

#2の定数にはより高い値がありますが、どちらも同じ複雑さを持ちます。あなたはUの次の隣接ノードに移動する前間のすべてのエッジのuVを評価することを確認する必要がありますどのような場合には

関連する問題