/**
* Created by eminem on 16-12-7.
*/
public class BreadthFirstPaths {
private boolean[] marked;
private int[] edgeTo;
private final int s;
public BreadthFirstPaths(Graph G, int s) {
int num = G.V();
marked = new boolean[num];
edgeTo = new int[num];
this.s = s;
dfs(G, s);
}
private void dfs(Graph G, int s) {
Queue<Integer> queue = new Queue<Integer>();
marked[s] = true;
queue.enqueue(s);
while (!queue.isEmpty()) {
int v = queue.dequeue();
for (int w : G.adj(v)) {
if (!marked[w]) {
edgeTo[w] = v;
marked[w] = true;
queue.enqueue(w);
}
}
}
}
public boolean hasPathTo(int v) {
return marked[v];
}
public Iterable<Integer> pathTo(int v){
if(!hasPathTo(v)) return null;
Stack<Integer> stack=new Stack<Integer>();
for(int x=v;x!=s;x=edgeTo[x]){
stack.push(x);
}
stack.push(s);
return stack;
}
}