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

时间:2014-03-11 16:48:52

标签: algorithm depth-first-search breadth-first-search

我试着环顾互联网,但我现在有点卡在修改BFS或DFS算法方面,以便能够在有向图中找到一个循环。如果图不是定向的,DFS算法会使用后边缘解决这个问题,但是这个方法在查看有向图时会失败。

有人能指出我正确的方向吗? 谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

跟踪当前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;
}

答案 1 :(得分:0)

DFS算法classifies graph edges into three categories *

  • 前沿
  • 交叉边
  • 后缘

如果您的图表有后边缘,则它有一个周期。当您运行DFS算法并查看备份时,检查从后边缘通向当前节点的顶点的路径部分将为后边缘所属的周期提供一组节点。

* 有时,树边缘被视为与前边缘分开的一个类别,这对于本讨论而言是无关紧要的。