いくつかの助けのためにgratfeullだろう。あなたのPDFで使用されている命名規則と少し違うが、それが何をするのかははっきりしているはずです。 すべてm_*
変数は、m_topoOrder
とm_cycle
を除き、スタックです。 サイクルのノードはm_cycle
になります。 m_onStack
は、再帰呼び出しスタック上にあるノードを追跡します。
完全な説明については、Robert SedgewickのAlgorithmsをお読みください。
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);
}
ビットがチェックされているように見えます:一度「灰色」のノードに出会って、最初から最後の灰色のノードに進むと、サイクルのノードが得られます –