図の//ストレージ構造:
CONST INT MAXSIZE = 10;
//隣接行列
テンプレート<クラスT>
クラスMGraph {
パブリック:
MGraph(A T []、N-INT、int型E);
ボイドDFS(V int型);
ボイドBFS (V int型);
プライベート://エッジエッジが無向グラフを示すために使用され、アークがアーク有向グラフを示すために使用される、頂点が頂点である
[MAXSIZE]はT頂点;
INTアーク[MAXSIZE] [MAXSIZE];
INTエッジ[ MAXSIZE] [MAXSIZE];
int型vNum、arcNum、ENUM;
BOOL *訪問; // DFSを使用する
};
テンプレート<クラスT>
MGraph <T> :: MGraph(A T []、V int型、INT E){// n個の頂点の数であり、Eはエッジの数であり、[]各頂点の値である
vNum = V; //頂点の数、エッジの数は、にクラス属性値頂点
; arcNum = E
新しい新しい= BOOLを訪問したが[V];
のmemset(訪問、falseに、はsizeof(BOOL)V *)。
用(int型K = 0; K <V、K ++){
頂点[K] = A [K];
}
{//最初の隣接行列の初期化(; K <V K ++ INT K = 0)のため
のための(int型J = 0; J <V、J ++){
ARC [K] [J] = 0;
}
}
(int型K = 0、IはJ = 0、= 0; K <E、K ++){//このは無向図の隣接行列、2つの頂点の隣接する入力
CIN I >> J;
ARC [-J 1] [I-1] = ARC [1-I]、[J-1] = 1;
}
}
//支台テーブルは、同様に、非目視側に一例としてのARCで表される
構造体ArcNode {//エッジデータ構造、及び側端に格納された情報
のint adjvex; //隣接する頂点
ArcNode * nextarc;
};
構造体{VertexNode / /頂点データ構造を格納する頂点情報と次のエッジ
INT頂点;
ArcNode * firstarc;
};
テンプレート<クラスT>
ALGraph {クラス
パブリック:
ALGraph(A T []、N-INT、INT E);
//〜ALGraph();
ボイドDFS(V int型);
ボイドBFS(V int型);
プライベート:
VertexNodeのadjlist [MAXSIZE];
int型vNum 、arcNum;
BOOL *訪問;
};
テンプレート<クラスT>
ALGraph <T> :: ALGraph(A T []、V int型、INT E){
vNum = V;
arcNum = E;
訪問BOOL新しい新しい= [V]。
memsetの(falseに、はsizeof(BOOL)* Vを訪問)
のために(INT Iは= 0; I <V、I ++){//は、頂点のテーブル初期化
adjlistを[I] .vertex = A [I];
adjlist [I ] .firstarc = NULL;
}
ための(int型K = 0、I = 0、J = 0; K <E、K ++){//これは無向グラフであり、有向グラフは、次いで、頂点iについては、Jを指すように、場合に
CIN >>私>> J;二重矢印を持つように何があるだろうとして、ここで//電子ノートでは、各頂点のエッジコネクションの合計ではありません(実際には無向グラフで表さ収まらない)
ArcNode * = S新しい新しいArcNode ;
S-> J = adjvex; //本明細書で使用されるヘッド挿入方法で
S-> nextarc = adjlist [-I 1] .firstarc;
adjlist [-I 1] .firstarc = S;
}
}
//注:隣接テーブル適切な有向グラフを示し、逆隣接リスト表現があり、隣接テーブルの指示方向とは逆に、逆のテーブルは、隣接するエッジリストに類似している
ストレージノードの構成のみ、//直交リスト
構造体VertexNodeC {
int型頂点。
* firstinのArcNode;
ArcNode最初のうち、*;
};
構造体ArcNodeC {
int型headvex、tailvex;
ArcNode * HLINK;
};
//セットアレイ側、より一般的には、二次元アレイの使用が格納され、配列に格納された頂点のストレージアレイは、出発点、端の重み
構造体ArcNodeE {
int型headvex;
INT tailvex。
重量INT;
};
//グラフトラバース:DFSとBFS
端に//バイナリツリーの先行順走査と同様のDFS深さ優先探索、分岐開始し、ステップバックを見つけるためにノードを訪問していない
// DFS隣接リストおよび隣接行列二つの記憶構造
// DFS二つの記憶構造比較
時間複雑隣接行列// N
、N + E Nスタック深さと空間の複雑さNの時間複雑さの//隣接リスト
テンプレート<クラスT>
ボイドMGraph <T> :: DFS(V int型){
COUT <<頂点[V]、
訪問[V] = trueに、訪問先アクセスさに//頂点フラグ
(INT J = 0; J < vNum; J ++){検索する隣接行列、マーキング深さの特性を持つ//に従って
IF(ARC [V] [J] == 1 &&訪問[J] == falseに){。
DFS(J);
}
}
}
テンプレート< Tクラス>
ボイドALGraph <T> :: DFS(V int型){//第1のエッジの頂点ノードから頂点ノードにテーブルに隣接接続し、任意のアクセスがある場合、アクセスフラグ、及びステップバックかどうかを確認します隣接ノード
COUT << adjlist [V] .vertex。
[V]訪問=はtrue。
* P = adjlist ArcNode [V] .firstarc;
一方(P){
IF(訪問[P-> adjvex] == falseに){
DFS(P-> adjvex);
}
P = P-> nextarc;
}
}
//使用BFS BFS、同様のツリートラバーサル順序、キュー論理構造
@をそれぞれ隣接行列テーブルを当接は説明
// n回複雑隣接行列
//時間複雑隣接テーブルスペースの複雑さのn + E N-
テンプレート<クラスT>
ボイドMGraph <T> :: BFS(V int型){
int型キュー[MAXSIZE];
INT F = 0、0 = R&LT;
; COUT <<頂点[V]
をtrueに訪問[V] =;
キュー[+ R&LT +] = V;
ながら(!F = R&LT){//キューのヘッドエンドに等しいが空である、キューが発現空である
; V =キュー[F ++]
(; J <vNum、J ++ INT J = 0)のための{
(ARC [V] [J] == 1 &&訪問[J] == falseに)IF {
COUT <<頂点[J]。
[J] =真訪れました。
キュー[++ R] = J;
}
}
}
}
テンプレート<クラスT>
ボイドALGraph <T> :: BFS(INT V){
int型のキュー[MAXSIZE]。
INT F = 0、R = 0。
COUT << adjlist [V] .vertex。
[V]訪問=はtrue。
キュー[++ R] = V。
一方、(!R = F){
V =キュー[++ F]。
ArcNode * P = adjlist [V] .firstarc。
(P)、一方{
INT J = P-> adjvex。
IF(訪問[J] ==偽){
COUT << adjlist [J] .vertex。
[J] =真訪れました。
キュー[R&LT ++] = J;
}
P = P-> nextarc;
}
}
}
4つの別々の一つプリム、クラスカル、フロイド、ダイクストラにおける図の基本的なアルゴリズムに関する。
図(DFS、BFS)のデータ構造を実装し、トラバース
おすすめ
転載: www.cnblogs.com/cimuhuashuimu/p/12134076.html
ランキング