实现:
维护3个变量(boolean[] marked, int[] edgeTo, int s)
marked 记录是否访问过该顶点,
edgeTo 记录路径上的上一个顶点,
s 记录路径的起始顶点。
- 遍历图的时候,先把marked初始化 元素全部都为FALSE,这样如果没有连通的顶点就会还是FALSE,而可以遍历到的顶点修改为TRUE。
- 记录edgeTo edgeTo是从起始顶点 s 出发,下一个顶点保存的是起始顶点的位置。
注意:
- 在递归的时候,会根据marked是否已经访问过,这样遍历过的其他顶点就会在递归的时候跳过。
- edgeTo数组中记录的是当前顶点到起始顶点路径上的上一个顶点。在初始化变量之后,就可以遍历数组(从结束顶点开始,往上查找)直到找到等于起始顶点的值结束,路径上的值都push到Stack中。
private boolean[] marked;
private int[] edgeTo;
private int s;
public DepthFirstPathsR(Graph G, int s){
marked = new boolean[G.V()];
edgeTo = new int[G.V()];
this.s = s;
dfs(G, s);
System.out.println();
}
private void dfs(Graph G, int v) {
marked[v] = true;
for(int w : G.adj(v)){
if(!marked[w]){
edgeTo[w] = v;
dfs(G, w);
}
}
}
public boolean hasPath(int v){
return marked[v];
}
public Iterable<Integer> pathTo(int v){
if(!hasPath(v)) return null;
Stack<Integer> path = new Stack<>();
for (int i = v; i != s; ) {
path.push(i);
i = edgeTo[i];
}
path.push(s);
return path;
}
网友评论