使用DFS的hasCycle()方法出了什么问题?

时间:2019-04-17 14:33:08

标签: java algorithm graph depth-first-search cycle

我正在尝试制作一种简单的hasCycle()方法来检测图中的循环,但是我遇到了一些问题。

我使用的代码是:

public static boolean hasCycle(Graph g, Vertex prev, Vertex u, Set<Vertex> known) {
known.add(u);

for(Vertex temp : g.getNeighbours(u)){
  if(!known.contains(temp)){
    if(hasCycle(g,u,temp,known))
      return true;

    else if(temp != prev)  
      return true;
  }
}

return false;
}

public static boolean hasCycle(Graph g) {
Set<Vertex> known = new TreeSet<>();

for(Vertex u : g.getAllVertices()){
  known.add(u);
  return hasCycle(g,u,u,known); // is this correct, how do I overload this method
}

return false;
}

当我测试像这样的输入时:

public static void main(String[] args){
    Graph g = new Graph();
    Vertex v = new Vertex(0);
    Vertex w = new Vertex(1);

    g.addVertex(v);
    g.addVertex(w);
    g.addEdge(v, w);
    System.out.println(hasCycle(g)); // this is printing true
}

public static void main(String[] args){
    Graph g = new Graph();
    Vertex v = new Vertex(0);

    g.addVertex(v);
    g.addEdge(v, v);
    System.out.println(hasCycle(g)); // this is printing false
}

我无法理解出了什么问题。我将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果...,也许将else语句移到外部。而且,仅获取图形的函数不应在第一次迭代时返回...

答案 1 :(得分:0)

您的代码失败原因:


函数hasCycle(Graph g)是错误的,因为:

  • 根据从第一个节点可到达的所有节点返回true / false (如果图形断开了怎么办?)

函数hasCycle(图形g,顶点prev,顶点u,Set已知)也是错误的:

  • 仅当找到当前节点的相邻节点时,才返回true 一个未被访问且不等于前一个节点的节点 找到周期没有任何意义。

建议:

请参考一些教程,例如:https://www.geeksforgeeks.org/detect-cycle-in-a-graph/,并尝试了解循环查找算法的工作原理,然后尝试实现它。

答案 2 :(得分:0)

此代码将起作用。我还没测试

UserControl

请注意,我为每个DFS调用传递了一个新初始化的已知集。每个DFS将具有其自己的已访问顶点副本。如果在单个DFS调用中两次遇到顶点,则该图被称为具有循环。