private void dfs(EdgeWeightedDigraph G, int v) { m_onStack[v] = true; m_marked[v] = true; foreach (DirectedEdge e in G.adj(v)) { int w = e.To; if (m_cycle != null) { return; } else if (!m_marked[w]) { m_edgeTo[w] = e; dfs(G, w); } else if (m_onStack[w]) { m_cycle = new Stack <DirectedEdge>(); DirectedEdge ee = e; while (ee.From != w) { m_cycle.Push(ee); ee = m_edgeTo[ee.From]; } m_cycle.Push(ee); } } m_onStack[v] = false; }
private void relax(EdgeWeightedDigraph G, int v) { foreach (DirectedEdge e in G.adj(v)) { int w = e.To; if (m_distTo[w] > m_distTo[v] + e.Weight) { m_distTo[w] = m_distTo[v] + e.Weight; m_edgeTo[w] = e; if (!m_onQueue[w]) { m_queue.Enqueue(w); m_onQueue[w] = true; } } // if (m_cost++ % G.V == 0) // findNegativeCycle(); } }
private void dfs(EdgeWeightedDigraph G, int v) { m_onStack[v] = true; m_marked[v] = true; foreach (DirectedEdge e in G.adj(v)) { int w = e.To; if (m_cycle != null) { return; } else if (!m_marked[w]) { m_edgeTo[w] = e; dfs(G, w); } else if (m_onStack[w]) { m_cycle = new Stack<DirectedEdge>(); DirectedEdge ee = e; while (ee.From != w) { m_cycle.Push(ee); ee = m_edgeTo[ee.From]; } m_cycle.Push(ee); } } m_onStack[v] = false; }
private void relax(EdgeWeightedDigraph G, int v) { foreach (DirectedEdge e in G.adj(v)) { int w = e.To; if (m_distTo[w] > m_distTo[v] + e.Weight) { m_distTo[w] = m_distTo[v] + e.Weight; m_edgeTo[w] = e; if (!m_onQueue[w]) { m_queue.Enqueue(w); m_onQueue[w] = true; } } // if (m_cost++ % G.V == 0) // findNegativeCycle(); } }