private void bfs(Diagraph g, IEnumerable <int> sources)
        {
            Queue <int> q = new Queue <int>();

            for (int v = 0; v < g.V; v++)
            {
                distTo[v] = Int32.MaxValue;
            }

            foreach (int s in sources)
            {
                distTo[s] = 0;
                marked[s] = true;
                q.Enqueue(s);
            }

            while (q.Count != 0)
            {
                int v = q.Dequeue();

                foreach (var i in g.adj(v))
                {
                    if (!marked[i])
                    {
                        edgeTo[i] = v;
                        distTo[i] = distTo[v] + 1;
                        marked[i] = true;
                        q.Enqueue(i);
                    }
                }
            }
        }
        public void dfs(Diagraph g, int v)
        {
            marked[v]  = true;
            onStack[v] = true;
            foreach (int w in g.adj(v))
            {
                if (cycle != null)
                {
                    return;
                }

                if (!marked[w])
                {
                    edgeTo[w] = v;
                    dfs(g, w);
                }
                else if (onStack[w])
                {
                    //we have cycle
                    cycle = new Stack <int>();
                    int i = v;
                    for (; i != w; i = edgeTo[i])
                    {
                        cycle.Push(i);
                    }
                    cycle.Push(w);
                    cycle.Push(v);
                    return;
                }
            }

            onStack[v] = false;
        }
Пример #3
0
 public void dfs(Diagraph g, int v)
 {
     marked[v] = true;
     foreach (int w in g.adj(v))
     {
         if (!marked[w])
         {
             edgeTo[w] = v;
             dfs(g, w);
         }
     }
 }
Пример #4
0
 public void dfs(Diagraph g, int v)
 {
     marked[v]      = true;
     connectedId[v] = connectedComponentCounter;
     foreach (int w in g.adj(v))
     {
         if (!marked[w])
         {
             dfs(g, w);
         }
     }
 }
        // run DFS in digraph G from vertex v and compute preorder/postorder
        private void dfs(Diagraph G, int v)
        {
            marked[v] = true;
            preArr[v] = preCounter++;
            preorder.Enqueue(v);
            foreach (int w in G.adj(v))
            {
                if (!marked[w])
                {
                    dfs(G, w);
                }
            }

            postorder.Enqueue(v);
            postArr[v] = postCounter++;
        }