新しいエッジを追加した後の最小スパニングツリーを更新する実装は切除グラフ - ここ
我々が与えられたグラフ(n個の頂点とm個のエッジを有する)G の最小スパニングツリーTを与えられていると仮定していますGに追加するウェイトw の新しいエッジe =(u、v)を計算します。グラフG + eの最小 スパニングツリーを見つける効率的なアルゴリズムを与えます。 あなたのアルゴリズムはO(n) 時間で実行し、フルクレジットを受け取るようにしてください。
私はこのアイデアがありますトリッキーな部分はO(n)の時間でこれを行う方法であり、それは私が動けなくもあり
In the MST, just find out the path between u and v. Then find the edge (along the path) with maximum weight; if the maximum weight is bigger than w, then remove that edge from the MST and add the new edge to the MST.
を。
質問は、MSTがどのように格納されるかです。通常のプリムのアルゴリズムでは、MSTは親配列として格納され、すなわち、各要素は、対応する頂点の親である。
私がMSTを示す親配列を与えた場合、上記のアルゴリズムをO(n)でどのように公開することができますか?
まず、親配列からuとvの間のパスを特定するにはどうすればよいですか?私はuとvの2つの祖先配列を持つことができます。そして共通の祖先をチェックしてください。私はこの部分について、共通の祖先を見つけるために、少なくとも私はO(n^2)でそれをしなければならないと思います、そうですか?
次に、パスがあります。しかし、パスに沿って各エッジの重みを見つける必要があります。グラフはPrimのアルゴリズムにadjacency-listを使用すると仮定しているので、エッジの各重みを見つけるためにO(m)(mはエッジの数)を行わなければなりません。
...
だから私はO(n)の中でアルゴリズムを行うことが可能です表示されません。私が間違っている?
親配列をMSTに使用すると、uとvの間のパスを追跡することはO(n)とは思われません。たとえば、uがvの祖先でなく、vがuの祖先でない場合、uとvは共通の祖先yを持ち、uからy、vからyまでトレースできます。どのようにuからvまでトレースできますか?またはvからO(n)のuへ? –
また、親の配列から、どのようにO(1)の各辺の重みを得ることができますか? –
@JacksonTaleあなたの質問に答える詳細については、私の答えを編集しました。希望を明確にする。 – deebee