알고리즘 - 도로지도 쿼리 - 폭 우선 탐색

사용법 #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; 
            TYPENAME 그래프 :: adjIterator 형용사 (G, V); 
             ( INT I = adj.begin () ;! adj.end (); 나는 = adj.next을 ()) {
                 경우 (! 구경 [I]) { 
                    q.push (I); 
                    [I] 방문 = ;
                     [I] = V; 
                    ORD [I] = ORD [V] + 1 
                } 
            } 
        } 
        

    }
     ~ 경로 () {
         삭제 [] 방문
         삭제 ] 에서 ,
         삭제 경우 ord]; 
    } 
    // W에 대한 S의 경로가있는 경우 
    BOOL hasPath는 ( INT W) { 
        어설 (W > = 0 && W를 < GV는 ());
         복귀 [W] 구경; 
    } 

    //이 w에 S에서 경로의 개수를 
    무효 로 ( INT는 , 벡터 w < INT > & VEC) { 
        스택 < INT > S;
        
        int로 P =w;
        반면 (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 난 = 0 ; I <vec.size을 (); I ++ ) { 
            COUT을 <<VEC [I];
            만약 - (I vec.size == () 1 ) 
                COUT << ; ENDL
            다른 
                COUT << " -> " ; 
        } 

    } 
    INT lenth ( INT w) { 
        어서 트 (w > = 0 && w < GV ());
        반환 [W] ORD; 
    } 

};

 

추천

출처www.cnblogs.com/Erick-L/p/12623336.html