約1年前、友人と私は、通常のバウンドよりも優れた密度のグラフのクラスカルのアルゴリズムを実装する方法を考えました(事前にソートされたエッジを想定せずに)。具体的には、隣接行列を使用して実装された場合のプリムと同様に、すべての場合でを実現します。
C ++コードやベンチマークなど、アルゴリズムについて少しブログに投稿しましたが、一般的な考え方は次のとおりです。
接続されたコンポーネントごとに1つの代表ノードを維持します。最初は、すべてのノードが自分自身を表しています。
dist[i]
すべてのコンポーネントについてi
、に入射するコンポーネント交差エッジが最も軽いようにベクトルを維持しi
ます。パーティションを横切る最も軽いエッジを見つけるとき、線形時間で
i
の重みを最小にする単純なものを見つけますdist[i]
。接合2つの成分が場合と、隣接行列変更、そのような今ですべてのコンポーネントのためのK、及びマーク接続されたコンポーネントの代表ではなくなったi(jのみが残ります)。
したがって、最も軽いエッジの収縮と前記エッジの検出の両方を線形時間で行うことができます。これを回実行して、MSTを見つけます。MSTにどのエッジを追加するかを実際に見つけるには、少しの簿記が必要ですが、複雑さは増しません。したがって、ランタイムはです。実装は、forループのほんの一部です。
クラスカルのこのバージョンは文献でよく知られていますか?