グラフを解決するためにDFSアルゴリズムを用いた相関アルゴリズム

/ * 
図の非連結成分Gの数検索
DFSを使用する
* / 
ボイド DFS(グラフG、int型V){ 
    eノード * P; 
    訪問[V] = trueに
    訪問(T); 
    P = G-> adjListを[V ] .firstarc;
     一方(P =!NULL ){
         IF(== [P-> adjvex]を訪問falseに){ 
            DFS(G、P - > adjvex); 
        } 
        P = P-> nextarc; 
    } 
} 
int型ComnNum(グラフG){
     int型 NUM = 0 ;
     のためINTは iは= 0 ; I <G->頂点; I ++ ){ 
        訪問[I] = 
    } 
    ためINT iは= 0 ; I <G->頂点; I ++ ){
         場合(訪問[I] == ){ 
            DFS(G、I)。
            NUM ++ ; 
        } 
    } 
}
/ * 
隣接テーブル記憶用いグラフG 
アルゴリズムは、図は、接続グラフGであるか否かを判断する設計
* / 
ボイド DFS(グラフG、int型V){ 
    eノード * ; P 
    訪問[V]が = trueにし
    訪問(V); 
    P = G- > adjList [V] .firstarc;
     ながら(!P = NULL ){
         IF(訪問[P-> adjvex] == falseに){ 
            DFS(G、P - > adjvex); 
        } 
        P = P-> nextarc; 
    } 
} 
BOOL IsConnect(グラフG)は{
     BOOL内のフラグは、= trueにint型は[MAXSIZE]訪問しました。
    以下のためにINT iが= 0 ; I <g.Verticesを、I ++ ){ 
        訪問[I] = 
    } 
    DFS(G、0 );
    以下のためにINT iが= 0 ; I <G->頂点; I ++ ){
         場合(訪問[I] == ){ 
            フラグ = 休憩; 
        } 
    } 
    戻りフラグ。
}
/ *は
隣接図形のVI-とテーブル> Vjのパスがあるか否かを判断する
* / 
ボイド DFS(グラフG、int型V){ 
    eノード * ; P 
    訪問[V] = trueに
    訪問(T)は、
    P = G- > adjList [V] .firstarc;
     ながら(!P = NULL ){
         IF(訪問[P-> adjvex] == falseに){ 
            DFS(G、P - > adjvex); 
        } 
        P = P-> nextarc; 
    } 
} 
BOOLが訪問[MAXSIZE];
 BOOL existPath(グラフG、int型 V、INTJ){
     ためintは iが= 0を I <G->頂点; I ++ ){ 
        訪問[I] = 
    } 
    DFS(G、V)。
    もし(訪問[J] == ){
         戻り 
    } {
         戻り 
    } 
}
/ * 
無向図の記憶隣接テーブル検索)関数concomxを(設計
kの連結成分の正確数のノードの数
* / 
無効 DFS(グラフG、int型 V、BOOL&[訪問]を、INT{vNum)を
    eノード * P; 
    訪問[V] = trueに
    vNum ++ ;
     のために(P = adjList [V] - > firstarc; P; P = P-> 次に){
         IF(訪問[P-> adjvex] == flase) { 
            DFS(G、P - > adjvex、訪問、vNumが); 
        } 
    } 
} 
BOOLが訪問[MAXSIZE];
 INT concomx(グラフG、int型K){ // の数のノード
    INT COUNT = 0 ; // 連結成分の数を記録
    INT vNum = 0 ;
     のためのINT I = 0 ; I <G.vertices; I ++ ){ 
        訪問[I] = falseに; 
    } 
    INT I = 0 ; I <G.vertices; I ++ ){ 
        vNum = 0 ;
         IF(訪問[I] == falseに){ 
            DFS(G、I、訪問、vNum); 
        } 
        IF(vNum == K) ++ COUNT ; 
    }
    戻り値の数。
}
/ * 
無向グラフGが木であるか否かを判定し、アルゴリズムを設計します。
戻り真木、そうでない場合はfalse 

結論:アクセスノードとDFSアクセス番号側をnは(N-1)2であり、
辺の数は、ツリーのアクセスが2(N-1)である場合
* / 
ボイド DFS(グラフG、int型 V、INT&vNum、INT列挙型){ 
    のeNode * PLは、
    [V]を訪れた = trueに
    vNumを ++; //
     P = adjList [V] .firstarc、
     しばらく!(P = ヌル){ 
        列挙 ++; //
         IF(訪問[P-> adjvex] == falseに){ 
            DFS(G、P - > adjvex、vNum、列挙型)。
        } 
        P = P-> nextarc。
    } 
} 
ブールイストレ(グラフG){
     int型一= 0列挙= 0 以下のためにINT iが= 0 ; I <G.verticesを、I ++ ){ 
        訪問[I] = 
    } 
    DPS(G 1 、列挙型)。
    もし(一g.vertices && Knum == == 2 *(Vnum- 1 )){
         戻り 
    } エルス{
         戻り 
    } 
}
// なしG Gの隣接行列、図トラバーサルにおいてGに与えられた頂点V0は、深図開始
 // プレゼンス隣接行列Bと、得られたスパニングツリートラバーサル深
ボイド DFS(グラフG、int型 B [] [MAXSIZE]をINT V){ 
    訪問[V] = trueにのためにINT J = 0 ; J <G.vertices; J ++ ){
         IF!(GA [V]は[J] && 訪問[J]){ 
            B [V] [J ] = 1 ; 
            DFS(G、J、B); 
        } 
    } 
} 
BOOLは、訪問[MAXSIZE];
 ボイド shengchengTree(グラフG、int型B [] [MAXSIZE]){
     INT iは= 0 ; I <G.vertices; I ++ ){ 
        [i]を訪問 = 
    } 
    ためINT iは= 0 ; I <G.vertices; I ++ ){
         場合(!訪問[I]){ 
            DFS(G、B、I)。
        } 
    } 
}

おすすめ

転載: www.cnblogs.com/zzuuoo666/p/12101606.html