實現:
維護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;
}