#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。 } }。