アルゴリズム - ロードマップクエリ - 幅優先トラバーサル

#include <cassert> 
の#include <ベクトル> 

テンプレート <型名グラフ>
 クラスShortestPath 
{ 
プライベート
    グラフG;
     INT S; // 特定のポイント
    BOOL * 訪問;
     INT * から ; // パス
    INT * ORD; // 最小距離

公共
    ShortestPath(グラフ&グラフ、int型S):G(グラフ){
         // 初期化アルゴリズム 
        アサート(S> = 0 && S < GV()); 

        訪問= 新規新しい BOOL [GV()];
         から = 新しい新しい INT [GV()]; 
        ORD = 新しい新しい INT [GV()]; 

        のためのINT I = 0 ; I <GV(); I ++ ){ 
            訪問[I] = falseに;
             から [I] = - 1。; 
            ORD [I] = - 1 ; 
        } 
        これ - > S = S、

        キュー < INT > Q;
         // 図幅優先アルゴリズムない最短経路
        q.push(S)
        訪問した[S] = ; 
        ORD [S] = 0 ;
        しばらく(!q.empty())
        { 
            int型の V = q.front(); 
            q.pop(); 
            型名グラフ:: adjIterator ADJ(G、V)。
            INT I = adj.begin();! adj.end(); iは= adj.nextを()){
                 場合(!訪問[I]){ 
                    q.push(I)。
                    [i]が訪れた = ;
                    [I] = V。
                    ORD [I] = ORD [V] + 1 
                }
            } 
        } 
        

    }; 
    パス(){
         削除[]訪問、
         削除 [] から削除[] ORD; 
    } 
    // W秒からパスがある場合
    BOOL HASPATHは(INT W){ 
        アサート(W > = 0 && W < GV());
         戻り訪問[W]; 
    } 

    //はWに対してSからのパスの数である
    ボイドパス(INTベクトル<、wは整数 >&VEC){ 
        スタック < INT > S;
        
        int型 P =ワット;
        一方、(P =! - 1 ){ 
            s.push(P)。
            P = から[P]。
        } 
        vec.clear()。
        しばらく(!s.empty()){ 
            vec.push_back(s.top()); 
            s.pop(); 
        } 
    } 
    // 把路径打印出来
    空隙 showPath(INT W){ 
        ベクトル < INT > VEC。
        (VEC、W)経路; 
        INT iは= 0 ; I <vec.size()は、i ++ ){ 
            COUT <<VEC [i]は、
            もし(I == vec.size() - 1 
                COUT << ENDL。
            他の
                裁判所未満 << " - > " ; 
        } 

    } 
    int型レンス(INT W){ 
        アサート(W > = 0 && W < GV())。
        戻り[W] ORD。
    } 

}。

 

おすすめ

転載: www.cnblogs.com/Erick-L/p/12623336.html