web-dev-qa-db-ja.com

PrimとKruskalのアルゴリズムを有向グラフで使用できないのはなぜですか?

PrimとKruskalのアルゴリズムは、接続されて無向であるグラフの最小全域木を見つけるために使用されます。指示されたグラフで使用できないのはなぜですか?

20
user1472747

これらのアルゴリズムが最初から機能するのはマイナーな奇跡です。ほとんどの貪欲なアルゴリズムは、いくつかのインスタンスでクラッシュして燃焼するだけです。それらを使用して最小スパニング樹枝状(1つの頂点から他のすべての頂点への有向パス)を見つけることを想定すると、Kruskalの1つの問題のあるグラフは次のようになります。

 5
  --> a
 /   / ^
s   1| |2
 \   v /
  --> b
 3

コスト1のa-> bアークを取得し、s-> bのコスト3とb-> aのコスト2が本当に欲しかったので行き詰まります。

Primの場合、このグラフには問題があります。

 5
  --> a
 /   /
s   1|
 \   v
  --> b
 3

S-> bのコスト3を使用しますが、s-> aのコスト5とa-> bのコスト1が本当に必要でした。

29
David Eisenstat

プリムとクラスカルのアルゴリズムは、接続された「無向」グラフの最小スパニングツリーを出力します。接続されていない場合は、それらを微調整して最小全域フォレストを出力できます。

プリムのアルゴリズムでは、グラフを頂点の2つのセットに分割します。既にMSTを形成している探索された頂点の1つのセット(セット1)と、最終的に最初のセットに参加して「スパニング」(セット2)を完了する未探索の頂点の別のセット。それぞれの瞬間に、2つの互いに素なセットを結合するカットの最小の重み付きエッジを選択します。 MSTの探索されたノードから探索されていない残りのノードに向けられたEdgeがない場合、探索されていないノードからMSTの探索されたノードへのエッジがあっても、アルゴリズムはスタックします。

クラスカルのアルゴリズムでは、アイデアは、重みで昇順にエッジをソートし、それらを順番にピックアップして、MSTの探索ノード/エッジに含まれ、まだ探索されたノードでサイクルを形成していない場合です。これは、Union-Find DSによって行われます。ただし、この方法では、有向グラフのサイクルの検出は失敗します。例:エッジを含むグラフ[1-> 2] [2-> 3] [1-> 3]は、Union-Findメソッドでサイクルを含むと報告されます。

したがって、Primは、すべてのノードがすべてのノードから到達可能であると想定しているために失敗します。ただし、無向グラフでは有効ですが、ダイグラフでは正しくない可能性があります。サイクルの検出に失敗したため、クラスカルは失敗します。MSTの「最小」加重プロパティを満たすために、サイクルを作成するエッジを追加することが不可欠な場合があります。

また、有向グラフの場合、MSTは完全な意味を持ちません。有向グラフに相当するのは「最小全域樹形」で、これは単一の頂点からすべての頂点に到達できるツリーを生成します。

5
elborak9