給定圖G及起點s,查找從s到其他頂點的路徑。
設計一個類實現該算法,類的API如下:
基於深度優先搜索實現路徑查找,該算法擴展深度優先搜索,在原算法的基礎上添加一個實例變量edgeTo[],這個數組用於記錄每個與s連通的頂點回到s的路徑。
如下圖:
edgeTo[]的值為:
節點1與2(數組下標表示節點)存儲的為0,表示由節點1或2可以到節點0,節點3存儲的為2,表明節點3可以到節點2 。那么由節點0到節點3的路徑為0-2-3。
實現代碼如下:
public class DepthFirstPaths { private int s; private boolean[] marked; private int[] edgeTo; public DepthFirstPaths(Graph G, int s) { this.s = s; marked = new boolean[G.V()]; edgeTo = new int[G.V()]; dfs(G, s); } 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 hasPathTo(int v) { return marked[v]; } public Iterable<Integer> pathTo(int v) { if (!marked[v]) return null; Stack<Integer> path = new Stack<>(); for (int x = v; x != s; x = edgeTo[x]) path.push(x); path.push(s); return path; } }
示例:
如下圖,使用深度優先搜索查找G中頂點0到其他頂點路徑的過程及結果
public static void main(String[] args) { Graph G = new Graph(6); G.addEdge(0, 5); G.addEdge(0, 1); G.addEdge(0, 2); G.addEdge(2, 4); G.addEdge(2, 3); G.addEdge(2, 1); G.addEdge(3, 4); G.addEdge(3, 5); DepthFirstPaths paths = new DepthFirstPaths(G, 0); for (int x:paths.pathTo(5)) System.out.print(x + " "); System.out.println(); }