web-dev-qa-db-ja.com

エッジを変更して最小スパニングツリーを更新します

MSTを使用したグラフ(正の重みエッジ)一部のエッジeが新しい値に変更された場合、MSTを完全に作り直さずに更新するための最良の方法は何ですか。これは線形時間で実行できると思います。また、1)eがすでにMSTの一部であるかどうか、および2)新しいEdge、eが元のエッジよりも大きいか小さいかに基づいて、別のアルゴリズムが必要になるようです。

19
Peeber Burns

4つのケースがあります:

  1. EdgeはMSTにあり、Edgeの値を減らしています:
    現在のMSTはまだMSTです

  2. エッジがMSTになく、エッジの値を減らしています:
    このエッジをMSTに追加します。これで、正確に1サイクルになります。
    MSTの サイクルプロパティ に基づいて、そのサイクルで最も高い値を持つEdgeを見つけて削除する必要があります。 dfsまたはbfsを使用してそれを行うことができます。複雑さO(n)。

  3. EdgeはMSTにあり、Edgeの値を増やしています:
    このエッジをMSTから削除します。これで、接続する必要のある2つの接続コンポーネントができました。両方のコンポーネントをO(n)(bfsまたはdfs)で計算できます。これらのコンポーネントを接続する最小値のエッジを見つける必要があります。エッジを値の昇順で繰り返します。複雑さO (n)。

  4. EdgeがMSTになく、Edgeの値を増やしています:
    現在のMSTはまだMSTです

40

私のO(n)ソリューションは、エッジの変更を開始する前に、MSTを見つける必要があるという仮定に基づいています(グラフには示されていません)。これを行うには、クラスカルアルゴリズムを使用できます。 O(n log n)で機能し、副作用としてエッジのソート済みリストが生成されます。そのコストはソートによって支配されるため、エッジの重みを変更すると、O(log n)のソート済みリストから削除できます。そして、これもO(log n)に新しい値で挿入し直し、最後にクラスカルアルゴリズムを再度呼び出します。これは、エッジが並べ替えられているため、線形時間で実行されます。

これはあなたが要求した線形ソリューションですが、より速く実行できるようです。

1
KCH