循环检测代码在Java的有向图中未找到返回正确循环数的代码?
我编写了代码,用于使用循环检测代码在Java的有向图中未找到返回正确循环数的代码?,java,graph,depth-first-search,directed-graph,cyclic-graph,Java,Graph,Depth First Search,Directed Graph,Cyclic Graph,我编写了代码,用于使用DFS计算有向图中的循环数。检查循环是否存在的方法工作正常。现在,我遍历所有顶点(我在HashMap中有这些顶点),检查顶点是否未被访问,然后检查是否存在循环,如果存在循环,则将计数器递增1。现在代码中断,它没有给出正确的循环数,例如:对于具有以下边的图: (A B),(B C),(C E),(E A),(B E) 这是我的密码 public int getTotalCyclesinDir(){ clearAll(); int count=0; f
DFS
计算有向图中的循环数。检查循环是否存在的方法工作正常。现在,我遍历所有顶点(我在HashMap中有这些顶点),检查顶点是否未被访问,然后检查是否存在循环,如果存在循环,则将计数器递增1。现在代码中断,它没有给出正确的循环数,例如:对于具有以下边的图:
(A B),(B C),(C E),(E A),(B E)
这是我的密码
public int getTotalCyclesinDir(){
clearAll();
int count=0;
for (Vertex v : vertexMap.values()) {
if (!v.isVisited && isCyclicDirected(v))
count++;
}
return count;
}
public boolean isCyclicDirected(Vertex v){
if (!v.isVisited){
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()){
Vertex t = e.next().target;
if (!t.isVisited) {
if (isCyclicDirected(t))
return true;
}
else return true;
}
return false;
}
else return true;
}
public int getTotalCyclesinDir(){
clearAll();
整数计数=0;
对于(顶点v:vertexMap.values()){
如果(!v.isvisted&&isCyclicDirected(v))
计数++;
}
返回计数;
}
公共布尔isCyclicDirected(顶点v){
如果(!v.isvistated){
v、 setVisited(真);
迭代器e=v.adj.Iterator();
while(e.hasNext()){
顶点t=e.next().target;
如果(!t.isvis){
如果(isCyclicDirected(t))
返回true;
}
否则返回true;
}
返回false;
}
否则返回true;
}
您的算法至少有两个问题:
只检测图形中是否有任何循环。不能直接使用它来计算周期。例如,您的算法将在(A B)(B A)(C A)中计算两个周期,因为(C A)连接到访问的节点isCyclicDirected
- 如果要在示例中检测两个循环,则检测需要基于边,而不是基于顶点。(B E)形成一个循环,但B和E都标记为从以前的运行中访问
isCyclicDirected
方法中有太多返回语句。有什么方法可以简化它吗?如果您需要代码的其他部分,我可以在if/else中添加它们,我会首先使用简短的例子,特别是如果这样可以避免出现not。另外,如果您有条件地返回,那么在此之后您实际上不需要显式的else。我明白您的意思。1) 你所说的基于边缘的,你能详细说明一下2)在isCyclicDirected
方法中,我有太多的回报,这是所有必要的或任何简化的空间..谢谢,假设有一条河,你想数一数桥梁。你从桥的一侧开始,在到访的岸边做标记。然后你过了桥,在桥的另一边做了标记。然后您得出结论,因为您访问了两个方面,所以只有一座桥。我对代码进行了更改,并以不同的方式实现,以跟踪边缘。我仍然有一些问题,我在这里发布了。。