#include <cassert>
#include <vector>
template<typename Graph>
class Path
{
private:
Graph &G;
int s; //某一个点
bool* visited;
int* from;//路径
void dfs(int v){
visited[v] = true;
typename Graph::adjIterator adj(G,v);
for(int i =adj.begin();!adj.end();i= adj.next()){
if(!visited[i]){
from[i] =v;
dfs(i);
}
}
}
public:
Path(Graph &graph,int s):G(graph){
//算法初始化
assert(s>=0 && s < G.V());
visited = new bool[G.V()];
from = new int[G.V()];
for(int i =0;i<G.V();i++){
visited[i] = false;
from[i] = -1;
}
this->s = s;
//寻路算法
dfs(s);
};
~Path(){
delete[] visited;
delete[] from;
}
//从s到w是否有路径
bool hasPath(int w){
assert(w>=0 && w<G.V());
return visited[w];
}
//从s到w路径是多少
void path(int w,vector<int> &vec){
stack<int> s;
int p = w;
while (p!=-1){
s.push(p);
p = from[p];
}
vec.clear();
while (!s.empty()){
vec.push_back(s.top());
s.pop();
}
}
//把路径打印出来
void showPath(int w){
vector<int> vec;
path(w,vec);
for(int i=0;i<vec.size();i++){
cout<<vec[i];
if(i==vec.size()-1)
cout<<endl;
else
cout<<" --> ";
}
}
};