最小スパニングツリーのクラスカルのアルゴリズムの反対はそれで動作しますか?つまり、すべてのステップで最大重量(エッジ)を選択しますか?
最大スパニングツリーを見つける他のアイデアはありますか?
はい、そうです。
KruskalによるネットワークGの最大重みスパニングツリーを計算する1つの方法は、次のように要約できます。
- Gのエッジを重みで降順に並べ替えます。 Tを最大重みスパニングツリーを構成するエッジのセットとします。 T = Setに設定します。
- Tに最初のエッジを追加します。
- Tでサイクルを形成しない場合にのみ、次のエッジをTに追加します。残りのエッジがない場合は、終了してGが切断されることを報告します。
- Tにn-1個のエッジがある場合(nはGの頂点の数)、Tを停止して出力します。それ以外の場合は、手順3に進みます。
ソース: https://web.archive.org/web/20141114045919/http://www.stats.ox.ac.uk/~konis/Rcourse/exercise1.pdf 。
this ウェブサイトから:
「最大スパニングツリーは、最大の重みを持つ重み付きグラフのスパニングツリーです。各エッジの重みを否定し、クラスカルのアルゴリズムを適用することで計算できます(Pemmaraju and Skiena、2003、p。336)。
すべてのエッジの重みを反転して最小化すると、最大スパニングツリーが得られますか?それが機能する場合、同じアルゴリズムを使用できます。もちろん、重量ゼロは問題になります。
このスレッドは古すぎますが、グラフ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はグラフのエッジの数です。
元のグラフの重みを否定し、否定されたグラフで最小スパニングツリーを計算すると、正しい答えが得られます。その理由は次のとおりです。両方のグラフで同じスパニングツリーの場合、一方のグラフの加重和は他方のグラフの否定です。したがって、否定グラフの最小スパニングツリーは、元のグラフの最大スパニングツリーを提供する必要があります。
並べ替え順序を逆にし、頂点カットで重いエッジを選択するだけでは、最大スパニングフォレストが保証されません(クラスカルのアルゴリズムはツリーではなくフォレストを生成します)。すべてのエッジに負の重みがある場合、クラスカルの逆から取得した最大スパニングフォレストは、依然として負の重みパスになります。ただし、理想的な答えは、接続されていない頂点のフォレストです。つまり、| V |の森シングルトンツリー、または| V |総重量が0(負ではない)のコンポーネント。
改善アルゴリズムを提供します。
したがって、最大スパニングツリーを取得します。
このツリーは、ツリーの外側のエッジを満たします。追加するとサイクルが形成され、エッジの外側のエッジ<=サイクル内のエッジの重み
実際、これはスパニングツリーが最大スパニングツリーになるための必要十分条件です。
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にループがあり、矛盾が生じます。
このアルゴリズムは、UTD教授R. Chandrasekaranのメモから取られました。ここで参照できます: 単一商品多端末フロー