以有向图中存在的循环输出节点

时间:2011-07-30 03:50:50

标签: cycle graph-algorithm depth-first-search

虽然我知道我们可以通过检测后沿http://cs.wellesley.edu/~cs231/fall01/dfs.pdf来检测DFS算法的周期。在遵循上述方法的同时,我无法弄清楚如何以有效和“干净”的方式输出循环中的节点。

对于一些帮助会是gratfeull

由于

1 个答案:

答案 0 :(得分:0)

这就是我在自己的实现中做到的。它与PDF中使用的命名约定略有不同,但应该明确它的作用。 除m_*m_topoOrder之外,所有m_cycle个变量都是向量。 循环的节点将在m_cycle中。 m_onStack跟踪递归调用堆栈上的节点。

有关完整描述,我建议使用Robert Sedgewick的算法。

void QxDigraph::dfs(int v)
{
    m_marked[v] = true;
    m_onStack[v] = true;

    foreach(int w, m_adj[v]) {
        if(hasCycle()) return;
        else if(!m_marked[w])
        {
            m_edgeTo[w] = v;
            dfs(w);
        }
        else if(m_onStack[w])
        {
            m_cycle.clear();
            for(int x=v; x!=w; x = m_edgeTo[x])
                m_cycle.push(x);
            m_cycle.push(w);
            m_cycle.push(v);
        }
    }
    m_onStack[v] = false;
    m_topoOrder.push(v);
}