【问题标题】:recursive implementation of depth first search to find path between two nodes in Java深度优先搜索的递归实现以在Java中查找两个节点之间的路径
【发布时间】:2013-11-20 19:35:02
【问题描述】:

我正在尝试实现 DFS 的递归版本,以便在两个节点之间进行深度优先搜索。 这是我的代码。如果存在路径,该方法将返回 true,并且它还会更新节点的 prev 字段以跟踪路径。我已经使用堆栈实现了这种非递归方式,它工作正常,即here.。这个不工作。那就是它没有给我从节点 A 到节点 B 的路径。它似乎总是返回 false。

public boolean recursiveDFS(String start, String end){
  clearAll();
  Vertex source = vertexMap.get(start);
  Vertex dest = vertexMap.get(end);
  clearAll();

  return recursiveDFShelper(source,dest);
}

private boolean recursiveDFShelper(Vertex sor, Vertex des){
  if (!sor.name.equals(des.name)){
    sor.setVisited(true);
    Iterator<Edge> it = sor.adj.iterator();

    while (it.hasNext()){
      Vertex v = it.next().target;

      if(!v.isVisited){
        sor.prev=v;
        recursiveDFShelper(v, des); 
      }
    }
    return false;
  }
  else 
    return true;
}

编辑:根据以下建议,我有此代码

public boolean recursiveDFS(String start, String end){
        clearAll();
        Vertex source = vertexMap.get(start);
        Vertex dest = vertexMap.get(end);
        clearAll();

        return recursiveDFShelper(source,dest);

    }

    private boolean recursiveDFShelper(Vertex sor, Vertex des){
        //System.out.println(sor.name);

        if (!sor.name.equals(des.name)){
        sor.setVisited(true);
        System.out.println(sor.adj);
        Iterator<Edge> it = sor.adj.iterator();
        while (it.hasNext()){
            Vertex v = it.next().target;
            if(!v.isVisited){
                v.prev=sor;
                System.out.printf("prev of %s is %s\n",sor,sor.prev);
                return recursiveDFShelper(v, des);  
                }
            }
        //System.out.println("returning false");
        return false;
        }
        else {
           System.out.println("returning true");
           return true;
        }
        }

对于像这样的给定有向图,

A B
B C
C D
A E
E D 

它能够找到从 A 到 D 的正确路径,但从 A 到 E 失败了,而 E 仅在一个节点之外。

【问题讨论】:

    标签: java recursion path depth-first-search


    【解决方案1】:

    你需要改变

    return recursiveDFShelper(v, des);
    

    if(recursiveDFShelper(v, des)) {
      return true;
    }
    

    否则,您总是在第一次递归调用后从循环中返回。但是如果递归没有找到该元素,则需要继续搜索。另一方面,如果你在递归调用中找到了元素,你想停止搜索。

    【讨论】:

    【解决方案2】:

    好吧,你的代码中的问题是,只有你要返回 true 的时间是 sordes 参数在第一次调用递归函数时相等,否则你总是返回假。

    所以要解决这个问题,在recursiveDFShelper 中,您需要返回递归调用的结果。

    【讨论】:

    • 你是说这里吗? if(!v.isVisited){ sor.prev=v; return recursiveDFShelper(v, des); } 但我们必须在正确的地方返回 false?
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多