[解決済み] グラフ実装 C++
質問
c++でグラフの実装を手っ取り早く書けないかと考えています。私は、グラフアルゴリズム(BFS、DFS、クラスカ、ダイクストラなど)を使用し、操作しやすいデータ構造が必要です。 私はアルゴリズムオリンピックのためにこの実装が必要なので、データ構造を書くのが簡単であればあるほどよいです。
このようなDS(主な構造体またはクラスとその中に入るもの)を提案してもらえますか?隣接リストと隣接行列が主な可能性であることは知っていますが、私はより詳細な コード のサンプルです。
例えば、前回DFSのグラフを実装することになったとき、このDSについて考えたんです。
struct Edge {
int start;
int end;
struct Edge* nextEdge;
}
そして、i番目のノードから始まるエッジを表すエッジリスト(struct Edge)をi番目の場所に含むサイズnの配列を使用します。
しかし、このグラフをDFSしようとすると、10個ほどのwhileループを含む50行のコードを書かなければなりませんでした。
どんな「良い」実装があるのでしょうか?
どのように解決するのか?
どのようなアルゴリズムを実装する必要があるかに依存し、特効薬はありません(これは驚くべきことではありませんが、プログラミングの一般原則は一般原則がないということです;-)。).
有向マルチグラフをポインタを使ったノード・エッジ構造で表現することになることが多いのですが......具体的には。
struct Node
{
... payload ...
Link *first_in, *last_in, *first_out, *last_out;
};
struct Link
{
... payload ...
Node *from, *to;
Link *prev_same_from, *next_same_from,
*prev_same_to, *next_same_to;
};
つまり、各ノードは2重にリンクされた着信リンクのリストと、2重にリンクされた発信リンクのリストを持っているのである。各リンクは
from
と
to
ノードから出力されるすべてのリンクのリストです。
from
ノードに到着するすべてのリンクのリストと、同じ
to
ノードがあります。
ポインター
prev_same_from
と
next_same_from
から出てくるすべてのリンクの連鎖をたどる場合に使用されます。
から
同じノードのポインタ
prev_same_to
と
next_same_to
を指すすべてのリンクのチェーンを管理するときに使用されます。
から
は同じノードです。
ポインタをたくさん使うので、ポインタが好きな人以外は忘れてください)しかし、問い合わせと更新の操作は効率的です。例えば、ノードやリンクを追加するのはO(1)、リンクを削除するのはO(1)、ノードxを削除するのはO(deg(x))といった具合です。
もちろん、ペイロードサイズ、グラフサイズ、グラフ密度などの問題によっては、このアプローチはメモリに対して過剰な負荷となります(ペイロードに加えて、ノードあたり4ポインタ、リンクあたり6ポインタが必要です)。
似たような構造の完全な実装は以下の通りです。 こちら .
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された