図(DFS、BFS)のデータ構造を実装し、トラバース

図の//ストレージ構造:
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つの別々の一つプリム、クラスカル、フロイド、ダイクストラにおける図の基本的なアルゴリズムに関する。

おすすめ

転載: www.cnblogs.com/cimuhuashuimu/p/12134076.html