web-dev-qa-db-ja.com

最大スパニングツリーを見つける方法

最小スパニングツリーのクラスカルのアルゴリズムの反対はそれで動作しますか?つまり、すべてのステップで最大重量(エッジ)を選択しますか?

最大スパニングツリーを見つける他のアイデアはありますか?

50
user467871

はい、そうです。

KruskalによるネットワークGの最大重みスパニングツリーを計算する1つの方法は、次のように要約できます。

  1. Gのエッジを重みで降順に並べ替えます。 Tを最大重みスパニングツリーを構成するエッジのセットとします。 T = Setに設定します。
  2. Tに最初のエッジを追加します。
  3. Tでサイクルを形成しない場合にのみ、次のエッジをTに追加します。残りのエッジがない場合は、終了してGが切断されることを報告します。
  4. Tにn-1個のエッジがある場合(nはGの頂点の数)、Tを停止して出力します。それ以外の場合は、手順3に進みます。

ソース: https://web.archive.org/web/20141114045919/http://www.stats.ox.ac.uk/~konis/Rcourse/exercise1.pdf

58
systemkern

this ウェブサイトから:

「最大スパニングツリーは、最大の重みを持つ重み付きグラフのスパニングツリーです。各エッジの重みを否定し、クラスカルのアルゴリズムを適用することで計算できます(Pemmaraju and Skiena、2003、p。336)。

36
Tony The Lion

すべてのエッジの重みを反転して最小化すると、最大スパニングツリーが得られますか?それが機能する場合、同じアルゴリズムを使用できます。もちろん、重量ゼロは問題になります。

6
duffymo

このスレッドは古すぎますが、グラフG =(V、E)で最大スパニングツリー(MST)を見つける別の方法があります

MSTを見つけるために、何らかのPrimのアルゴリズムを適用できます。そのためには、最大加重エッジのカットプロパティを定義する必要があります。

Cutプロパティ:任意の時点で、MSTにある頂点を含むセットSがあるとしましょう(今のところ何らかの方法で計算されていると仮定します)。次に、S/Vセット(MSTにない頂点)について考えます。

要求:SからS/Vへのエッジは、最大の重みを持ち、常にすべてのMSTにあります。

証明:頂点をセットSに追加する時点で、SからS/Vへの最大重み付きエッジはe =(u、v)で、uはSに、vはS/Vにあるとしましょう。 eを含まないMSTを考えてみましょう。 Edge eをMSTに追加します。元のMSTにサイクルを作成します。サイクルをトラバースし、Sの頂点u 'とS/Vの頂点を見つけて、u'がS/Vに入る最後の頂点になり、v 'がS/Vのパス上の最初の頂点になるようにしますuからvへのサイクル。

エッジe '=(u'、v ')を削除すると、結果のグラフは接続されたままですが、eの重みはe'より大きくなります[eはこの時点でSからS/Vへの最大重み付きエッジです]結果として、MSTの重みの合計は元のMSTより大きくなります。これは矛盾です。つまり、Edge eはすべてのMSTに存在する必要があります。

MSTを見つけるアルゴリズム:

 Start from S = {s} // sは開始頂点です
 Sはすべての頂点を含みません
 do 
 {
 for each S 
の頂点sは、エッジe =(s、v)の重みが最大になるようにS/Vから頂点vを追加します
} 
 end while 

実装:キーがSの頂点からS/Vの頂点までのEdgeの最大ウェイトであり、値が頂点自体であるMax Heap/Priority Queueを使用して実装できます。 Sに頂点を追加すると、ヒープのExtract_Maxと等しくなり、Extract_Maxごとに、追加したばかりの頂点に隣接する頂点のキーが変更されます。

そのため、m個のChange_Key操作とn個のExtract_Max操作が必要です。

Extract_MinとChange_Keyは両方ともO(log n)で実装できます。 nは頂点の数です。

したがって、これにはO(m log n)時間かかります。 mはグラフのエッジの数です。

4
Imran

元のグラフの重みを否定し、否定されたグラフで最小スパニングツリーを計算すると、正しい答えが得られます。その理由は次のとおりです。両方のグラフで同じスパニングツリーの場合、一方のグラフの加重和は他方のグラフの否定です。したがって、否定グラフの最小スパニングツリーは、元のグラフの最大スパニングツリーを提供する必要があります。

1
Shen Yang

並べ替え順序を逆にし、頂点カットで重いエッジを選択するだけでは、最大スパニングフォレストが保証されません(クラスカルのアルゴリズムはツリーではなくフォレストを生成します)。すべてのエッジに負の重みがある場合、クラスカルの逆から取得した最大スパニングフォレストは、依然として負の重みパスになります。ただし、理想的な答えは、接続されていない頂点のフォレストです。つまり、| V |の森シングルトンツリー、または| V |総重量が0(負ではない)のコンポーネント。

1
Sojourner

改善アルゴリズムを提供します。

  • 最初に任意のツリーを構築します(BFSまたはDFSを使用)
  • 次に、ツリーの外側のエッジを選択し、ツリーに追加すると、サイクルが形成され、サイクル内の最小の重みエッジがドロップされます。
  • すべての残りのエッジが考慮され、このユーティリティを実行し続けます

したがって、最大スパニングツリーを取得します。


このツリーは、ツリーの外側のエッジを満たします。追加するとサイクルが形成され、エッジの外側のエッジ<=サイクル内のエッジの重み

実際、これはスパニングツリーが最大スパニングツリーになるための必要十分条件です。

Pf。

必要:これが必要であることは明らかです。または、Edgeを交換して、Edgeの重みの合計が大きいツリーを作成することもできます。

十分:ツリーT1がこの条件を満たし、T2が最大スパニングツリーであるとします。

エッジT1∪T2には、T1のみのエッジ、T2のみのエッジ、T1∩T2のエッジがあります。T2にT1のみのEdge(x1、xk)を追加すると、サイクルを形成することがわかります。そして、このサイクルにはと主張し、(x1、xk)と同じEdgeウェイトを持つT2のみのEdgeが1つ存在する必要があります。次に、これらのエッジを交換して、T2と共通のもう1つのエッジを持つツリーを作成し、エッジの重みの合計が同じになるようにして、これを繰り返してT2を取得します。したがって、T1は最大スパニングツリーでもあります。

主張を証明する:

t1はツリーであるため、サイクルではT2のみのエッジが必要であると仮定します。 T2のみのエッジに(x1、xk)の値と等しい値がない場合、T2のみのエッジのそれぞれがツリーT1でループを作成し、T1にループがあり、矛盾が生じます。

enter image description here


このアルゴリズムは、UTD教授R. Chandrasekaranのメモから取られました。ここで参照できます: 単一商品多端末フロー

1
XueYu