Java 如何使用深度优先搜索(DFS)检测有向图中的多个重叠循环?

Java 如何使用深度优先搜索(DFS)检测有向图中的多个重叠循环?,java,algorithm,depth-first-search,cycle,directed-graph,Java,Algorithm,Depth First Search,Cycle,Directed Graph,具有重叠圈的有向图的图像 总共有8个循环需要检测:- 1-2-3-4-5-1 1-2-3-6-5-1 1-2-7-6-5-1 1-2-7-4-5-1 1-8-7-6-5-1 1-8-7-4-5-1 1-8-3-4-5-1 1-8-3-6-5-1 我知道如何使用白色、灰色和黑色集合以及布尔数组/堆栈,但我仍在逻辑上苦苦挣扎。如果有任何帮助,我将不胜感激,我不需要详细描述如何编码,只需要如何使用算法(修改的DFS)以及可能的伪代码。再次感谢您抽出时间。在有向图中检测循环的关键是灰色(这意味着正在探

具有重叠圈的有向图的图像

总共有8个循环需要检测:-

1-2-3-4-5-1
1-2-3-6-5-1
1-2-7-6-5-1
1-2-7-4-5-1

1-8-7-6-5-1
1-8-7-4-5-1
1-8-3-4-5-1
1-8-3-6-5-1


我知道如何使用白色、灰色和黑色集合以及布尔数组/堆栈,但我仍在逻辑上苦苦挣扎。如果有任何帮助,我将不胜感激,我不需要详细描述如何编码,只需要如何使用算法(修改的DFS)以及可能的伪代码。再次感谢您抽出时间。

在有向图中检测循环的关键是灰色(这意味着正在探索节点及其邻居)
如果这些邻居中的一个与灰色节点有另一个连接,则有一个循环
因此,如果探测到的节点有一个灰色邻居,则有一个循环

换句话说,如果一个节点在其所有邻居被探测之前被重新访问,那么您就有了一个循环。

谢谢!我理解这一点,但它仍然没有解释算法如何检测这8个周期,因为有很多重叠。我以1为起点运行了DFS算法,虽然它成功地搜索了整个图,但我不太确定如何从算法中提取8个循环。我可以根据随机节点选择确定1个循环,但在此之后,当所有顶点都是黑色时,搜索将结束,而不给我剩余的循环“搜索整个图形”是关键。假设第一个dfs路径是
1-2-3-4-5
,当您到达5并发现它有一个灰色邻居(1)时,您存储找到的循环(1-2-3-4-5-1)。然后回溯并继续搜索,直到找到下一个循环。是的,搜索整个图形。但回溯时也要清除已访问状态。这样,当您第二次(1-2-3-6-5)到达节点5时,您将继续到1并找到第二个循环,依此类推。回溯时,如果我清除已访问状态,即将节点颜色更改回白色,则该节点不会再次成为未探测节点。因此,在进行前向跟踪时,它将再次搜索同一路径,因为除了节点1之外,所有节点都已变回白色。例如,检测到的第一个循环是1-2-3-4-5-1。然后我们回溯到1到5到4到3,并将5和4的颜色从灰色变回白色。然后从节点3开始,当我们寻找未探测的节点时,我们会不会再次找到节点4,因为它的颜色已经变回白色?对不起,C,我还不能将问题标记为已回答。我对算法开发相当陌生,所以请跟我谈谈。