[英]Finding a cycle in a directed graph using BFS or DFS
我尝试在Internet上四处查看,但是目前在修改BFS或DFS算法以能够在有向图中找到循环方面有些困惑。 如果该图不是有向图,则DFS算法将使用后边缘解决此问题,但是在查看有向图时此方法将失败。
谁能指出我正确的方向? 谢谢你的时间。
跟踪当前递归堆栈中用于DFS遍历的顶点。 如果到达递归堆栈中已经存在的顶点,则树中将存在一个循环。
创建一个数组recStack []并添加其中访问的每个顶点。 如果遇到已经访问过的顶点,则存在一个循环,您可以通过将该顶点再次传递到修改后的DFS函数进行打印来进行打印
bool isGraphCyclic(int v, bool visited[], bool *recStack)
{
if(visited[v] == false)
{
// Mark the current node as visited and part of recursion stack
visited[v] = true;
recStack[v] = true;
// Recur for all the vertices adjacent to this vertex
list<int>::iterator i;
for(i = adj[v].begin(); i != adj[v].end(); ++i)
{
if ( !visited[*i] && isGraphCyclic(*i, visited, recStack) )
return true;
else if (recStack[*i])
return true;
}
}
recStack[v] = false; // remove the vertex from recursion stack
return false;
}
DFS算法将图形边缘分为三类 * :
如果图形具有后边缘,则它具有循环。 当您运行DFS算法并看到后缘时,检查从后缘到当前节点的顶点到路径的那部分,将为您提供后缘所属循环中的一组节点。
*有时,树边缘被视为与前边缘分开的类别,对于本讨论而言,这是无关紧要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.