グラフには2つまたは3つの異なる最小全域木がありますか?


15

特定のグラフGに2つの異なる最小全域木があるかどうかを検出する効率的な方法を見つけようとしています。また、3つの異なる最小スパニングツリーがあるかどうかを確認する方法を探しています。私が考えた素朴な解決策は、クラスカルのアルゴリズムを一度実行して、最小スパニングツリーの総重量を見つけることです。後で、グラフからエッジを削除してクラスカルのアルゴリズムを再度実行し、新しいツリーの重みが元の最小スパニングツリーの重みであるかどうかをチェックします。グラフの各エッジについても同様です。ランタイムはO(| V || E | log | V |)であり、これはまったく良くありません。もっと良い方法があると思います。

どんな提案でも役立つでしょう、事前に感謝します


このようなアルゴリズムを知っておくと便利ですが、この現在の問題を解決することはできません
itamar

2
グラフには、(1)V G )の 2つのサブセットへのパーティションについて、各サブセットに1つのエンドポイントを持つ最小重みエッジが一意であり、(2)最大重みがGの任意のサイクルのエッジは一意です。GV(G)G
ジュホ

これらの質問12はすでにあなたの質問に答えていますか?
たJuho

で2番目に良いMSTを見つける方法については、CLRSの問題23-1を参照してください。O(n2)
カベ

回答:


7

Kapoor&Ramesh(適切なSIAM J. Comput。バージョンfree(?)個人Webサイトバージョン)は、重み付きグラフと重みなしグラフの両方ですべての最小全域木を列挙するアルゴリズムを提供します。

基本的な考え方についての私の理解は、1つのMSTから始めて、グラフのサイクルに沿ってあるエッジを交換することです(重みが大丈夫である限り、ツリーを再接続することがわかっている別のエッジと交換します) 。

加重場合のために、彼らはの木にまたがるすべての最小リストアップする実行時間は与えNは、このようなスパニングツリーの数です。重みの大きい順にそれらを列挙しますが、私の現在の(カーソリー)の理解は、特定の数のツリーを生成した後にアルゴリズムを終了することは完全に実行可能であることを示唆しています(MSTで開始して順次生成するため)。O(N|V|)N


ここでのこの状況では、超えるソリューションがあることがわかったら、アルゴリズムを早期に中止します。アルゴリズムはそれを許可していますか?k
ラファエル

1
@Raphael、私は実際にそれを理解する時間はありませんでした(割り当てマーク)、私の大まかな理解から、それは可能であるはずです-それはいくつかのMSTで始まり、それから一つずつ他のものを生成します。
ルークマティソン

1
@SaeedAmiri:「このようなスパニングツリーの数」とは、「スパニングツリーの数」ではなく「最小スパニングツリーの数」を意味します。すべてのスパニングツリーが最小スパニングツリーである場合、入力グラフは完全であり、すべてのエッジの重みは等しくなります。nn2
-JeffE

1
このペーパーでは、重み付きグラフと重みなしグラフの両方を考慮しているため、どちらも正しいです;)。また、必要なツリー数を生成した後にアルゴリズムを停止できる可能性があると思うので、OPの場合、これはます。繰り返しになりますが、見栄えを良くするには少し時間が必要です。O(|V|)
ルークマティソン

1
クイック読み取りの後、重み付きアルゴリズムは、重みの昇順でツリーを生成します(明らかにMSTから開始)。だから、OPの目的のためにそれをする必要があります。
ルークマティソン

2

Kruskalのアルゴリズムがすべての最小スパニングツリーを検出できることを示すことができます。こちらをご覧ください

したがって、Kruskalを実行し、複数のエッジから選択できる場合はいつでも、分岐できます。k分岐すると、少なくともk個の異なる最小スパニングツリーがあることがわかります。kk残念ながら、複数のブランチが異なる順序で同じ重みのエッジを追加することで同じツリーになる場合があるため、これはさらなる作業/洞察なしではあまり役に立ちません。


5
いいえ。1つのステップでエッジから選択する必要がある場合、それらのkエッジはすべてのスパニングツリーにある可能性があります。例えばただ乗りK 1 5等の重量1.まずステップ、5つのエッジの中から選択する必要があり、すべてのエッジを持つ星をしかし、スパニングツリーを一つだけは明らかに存在しています。おそらく、スパニングツリーに含まれている除外されたエッジと同じ重みを持つエッジの数を数えるのは役立ちますか?興味深い質問kkK1,5
...-フォンブランド

@vonbrand良い点。もちろん、計算のすべての分岐を続行できますが、実行時間はスパニングツリーの数によって決まります。これは指数関数的である場合があります。
ラファエル

1

複数のMSTがあるかどうかを確認するには、たとえばKruskalのアルゴリズムを検討してください。異なるMSTを作成できる唯一の方法は、同じ重量の複数のMSTがある場合に別のMSTを選択してエッジを除外することです。しかし、これらの同じ重量のエッジは、より軽いエッジでサイクルを形成するため除外された可能性があります...

したがって、Kruskalのアルゴリズムを実行する必要があります。同じ重みを持つ複数のエッジがある場合は、サイクルを作成せずに追加できるすべてのエッジを追加します。このウェイトのエッジが残っていて、ウェイトが低いエッジ(以前に追加された)でサイクルを閉じない場合、複数のMSTがあります。正確に2つまたは3つ以上があるかどうかを確認するなど、はるかに困難に見えます...


0

クラスカルのアルゴリズムの修正:エッジの順序付け中に、等しい重みでエッジをクラスター化します。ここで、エッジを順番に処理する時点で、新しいクラスターに到達するたびに、最初にすべてのエッジを個別に確認し、クラスターの前に構築されたものを考慮して、サイクルを閉じるエッジをクラスターから削除します。次に、クラスター内の残りのすべてのエッジを実行して、MSTに追加しようとします。それらのいずれかがサイクルを閉じる場合、それは以前に挿入された同じクラスターの他のエッジが原因である必要があり、複数のMSTがあることを意味します。

このソリューションは、クラスカルのアルゴリズムの複雑さを保持しますが、処理される各エッジの時間を増やすだけです。


クラスター全体を一定の時間で処理できると主張しているようですが、クラスターのサイズに明確な定数の限界はありません。その段階がどのように行われるかについて、詳細を教えていただけますか?
デビッドリチャービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.