MSTを使用したグラフ(正の重みエッジ)一部のエッジeが新しい値に変更された場合、MSTを完全に作り直さずに更新するための最良の方法は何ですか。これは線形時間で実行できると思います。また、1)eがすでにMSTの一部であるかどうか、および2)新しいEdge、eが元のエッジよりも大きいか小さいかに基づいて、別のアルゴリズムが必要になるようです。
4つのケースがあります:
EdgeはMSTにあり、Edgeの値を減らしています:
現在のMSTはまだMSTです
エッジがMSTになく、エッジの値を減らしています:
このエッジをMSTに追加します。これで、正確に1サイクルになります。
MSTの サイクルプロパティ に基づいて、そのサイクルで最も高い値を持つEdgeを見つけて削除する必要があります。 dfsまたはbfsを使用してそれを行うことができます。複雑さO(n)。
EdgeはMSTにあり、Edgeの値を増やしています:
このエッジをMSTから削除します。これで、接続する必要のある2つの接続コンポーネントができました。両方のコンポーネントをO(n)(bfsまたはdfs)で計算できます。これらのコンポーネントを接続する最小値のエッジを見つける必要があります。エッジを値の昇順で繰り返します。複雑さO (n)。
EdgeがMSTになく、Edgeの値を増やしています:
現在のMSTはまだMSTです
私のO(n)ソリューションは、エッジの変更を開始する前に、MSTを見つける必要があるという仮定に基づいています(グラフには示されていません)。これを行うには、クラスカルアルゴリズムを使用できます。 O(n log n)で機能し、副作用としてエッジのソート済みリストが生成されます。そのコストはソートによって支配されるため、エッジの重みを変更すると、O(log n)のソート済みリストから削除できます。そして、これもO(log n)に新しい値で挿入し直し、最後にクラスカルアルゴリズムを再度呼び出します。これは、エッジが並べ替えられているため、線形時間で実行されます。
これはあなたが要求した線形ソリューションですが、より速く実行できるようです。