虽然我知道我们可以通过检测后沿http://cs.wellesley.edu/~cs231/fall01/dfs.pdf来检测DFS算法的周期。在遵循上述方法的同时,我无法弄清楚如何以有效和“干净”的方式输出循环中的节点。
对于一些帮助会是gratfeull
由于
答案 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);
}