C++ で MST のプリムのアルゴリズムを実装しようとしています。デザインに関する質問があります
整数を取る最小ヒープを実装し、最小値を抽出し、キーを減らし、キーを挿入できます。
プリムで理解しているように、各頂点の重みと隣接情報を維持する必要があります。私が持っているいくつかのアイデアは次のとおりです。
1]構造を定義する
struct node {
int vertex;
int weight;
int neighbor;
};
最小ヒープを使用して、重みが最小のノードを返します。しかし、問題はキーの減少です。キーの減少の場合、呼び出し元はキーを減少させたい頂点を渡す必要があるためです。ヒープは要素を頻繁にスワップするため、リスト全体を調べて頂点を見つけ、そのキーを減らす必要があります。これは O(n) です。これを行うと Prim の状態が悪化すると思います。
2] もう 1 つの方法は、min-heap キュー内の頂点の位置を追跡する別の配列を維持することです。しかし、最小ヒープ操作中に位置を追跡するのは面倒です。
基本的に、reduce-key(v) を実行する必要がある場合、重みに基づく最小ヒープ キューで v を見つける方法。これを行うエレガントな方法はありますか?まだ複雑さを保持できるのはどれですか?