我正在尝试制作一种简单的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
}
我无法理解出了什么问题。我将不胜感激。
答案 0 :(得分:0)
如果...,也许将else语句移到外部。而且,仅获取图形的函数不应在第一次迭代时返回...
答案 1 :(得分:0)
您的代码失败原因:
函数hasCycle(Graph g)是错误的,因为:
函数hasCycle(图形g,顶点prev,顶点u,Set已知)也是错误的:
建议:
请参考一些教程,例如:https://www.geeksforgeeks.org/detect-cycle-in-a-graph/,并尝试了解循环查找算法的工作原理,然后尝试实现它。
答案 2 :(得分:0)
此代码将起作用。我还没测试
UserControl
请注意,我为每个DFS调用传递了一个新初始化的已知集。每个DFS将具有其自己的已访问顶点副本。如果在单个DFS调用中两次遇到顶点,则该图被称为具有循环。