深度优先搜索-查找路径

实现:

维护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<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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容