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;
        }
Esempio n. 2
0
 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;
        }
Esempio n. 4
0
 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();
     }
 }