深度优先搜索-查找路径

实现:

维护3个变量(boolean[] marked, int[] edgeTo, int s)
marked 记录是否访问过该顶点,
edgeTo 记录路径上的上一个顶点,
s 记录路径的起始顶点。

  1. 遍历图的时候,先把marked初始化 元素全部都为FALSE,这样如果没有连通的顶点就会还是FALSE,而可以遍历到的顶点修改为TRUE。
  2. 记录edgeTo edgeTo是从起始顶点 s 出发,下一个顶点保存的是起始顶点的位置。
注意:
  1. 在递归的时候,会根据marked是否已经访问过,这样遍历过的其他顶点就会在递归的时候跳过。
  2. 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 pathTo(int v){
        if(!hasPath(v)) return null;
        Stack path = new Stack<>();
        for (int i = v; i != s; ) {
            path.push(i);
            i = edgeTo[i];
        }
        path.push(s);
        return path;
    }

你可能感兴趣的:(深度优先搜索-查找路径)