繁体   English   中英

使用BFS或DFS在有向图中查找循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM