사용법 #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; } };