Esempio n. 1
0
        public void Search(IDirectedGraph <TVertex, TEdge> graph, IEnumerable <TVertex> roots)
        {
            Initialize(graph);

            if (roots == null || roots.Count() == 0)
            {
                roots = graph.Vertices.Where(v => graph.InEdges(v).Count() == 0);
            }

            foreach (var root in roots)
            {
                SearchInternal(root);
            }
        }
Esempio n. 2
0
        public IEnumerable <TVertex> Search(IDirectedGraph <TVertex, TEdge> graph, IEnumerable <TVertex> roots)
        {
            //Nova pretraga oslobadja bafer
            sortedVertices = new Stack <TVertex>(graph.VertexCount);

            //U slucaju da nije odredjen pocetni nod, krecemo od svih nodova redom
            if (roots == null || roots.Count() == 0)
            {
                roots = graph.Vertices.Where(v => graph.InEdges(v).Count() == 0);
            }

            //Poziv dfs da izracuna postorder redosled za sve cvorove grafa
            dfs.Search(graph, roots);
            return(sortedVertices);
        }
Esempio n. 3
0
        public void Search2(IDirectedGraph <TVertex, TEdge> graph, IEnumerable <TVertex> roots)
        {
            Initialize(graph);
            Stack <SearchFrame> searchStack = new Stack <SearchFrame>();

            if (roots == null || roots.Count() == 0)
            {
                roots = graph.Vertices.Where(v => graph.InEdges(v).Count() == 0);
            }

            foreach (var root in roots)
            {
                vertexColors[root] = VertexColor.Gray;
                OnDiscoverVertex(root);
                searchStack.Push(new SearchFrame(root, graph.OutEdges(root).GetEnumerator()));

                while (searchStack.Count > 0)
                {
                    var currentFrame = searchStack.Pop();
                    var u            = currentFrame.Vertex;
                    var edges        = currentFrame.Edges;

                    while (edges.MoveNext())
                    {
                        TEdge e = edges.Current;
                        OnExamineEdge(e);
                        TVertex v = e.Target;

                        if (vertexColors[v] == VertexColor.White)
                        {
                            searchStack.Push(new SearchFrame(u, edges));
                            u = v;
                            vertexColors[u] = VertexColor.Gray;
                            OnDiscoverVertex(u);
                            edges = graph.OutEdges(u).GetEnumerator();
                        }
                    }

                    if (edges != null)
                    {
                        edges.Dispose();
                    }

                    vertexColors[u] = VertexColor.Black;
                    OnFinishVertex(u);
                }
            }
        }
Esempio n. 4
0
        public void Search(IDirectedGraph <TVertex, TEdge> graph, IEnumerable <TVertex> roots)
        {
            Initialize(graph);
            Stack <TVertex> stack = new Stack <TVertex>();

            if (roots == null || roots.Count() == 0)
            {
                roots = graph.Vertices.Where(v => graph.InEdges(v).Count() == 0);
            }

            foreach (var root in roots)
            {
                stack.Push(root);

                while (stack.Count > 0)
                {
                    TVertex current = stack.Peek();
                    vertexColors[current] = VertexColor.Gray;
                    OnDiscoverVertex(current);

                    foreach (TEdge e in graph.OutEdges(current))
                    {
                        OnExamineEdge(e);
                        TVertex v = e.Target;

                        if (vertexColors[v] == VertexColor.White)
                        {
                            stack.Push(v);
                        }
                    }

                    //Zavrsavamo sa nod-om, posto je moguce da postoji vise instanci istog noda
                    //koje nisu beli nodovi potrebno ih je izbaciti sa steka.
                    while (stack.Count > 0 && vertexColors[stack.Peek()] != VertexColor.White)
                    {
                        current = stack.Pop();
                        if (vertexColors[current] == VertexColor.Gray)
                        {
                            vertexColors[current] = VertexColor.Black;
                            OnFinishVertex(current);
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        public void Search(IDirectedGraph <TVertex, TEdge> graph, IEnumerable <TVertex> roots = null)
        {
            Initialize(graph);

            if (roots == null || roots.Count() == 0)
            {
                roots = graph.Vertices.Where(v => graph.InEdges(v).Count() == 0);
            }

            foreach (var root in roots)
            {
                vertexColors[root] = VertexColor.Gray;
                OnDiscoverVertex(root);
            }

            Queue <TVertex> queue = new Queue <TVertex>(roots);

            while (queue.Count > 0)
            {
                TVertex u = queue.Dequeue();
                OnExamineVertex(u);

                foreach (TEdge e in graph.OutEdges(u))
                {
                    TVertex v = e.Target;
                    OnExamineEdge(e);

                    if (vertexColors[v] == VertexColor.White)
                    {
                        vertexColors[v] = VertexColor.Gray;
                        OnDiscoverVertex(v);
                        queue.Enqueue(v);
                    }
                }

                vertexColors[u] = VertexColor.Black;
                OnFinishVertex(u);
            }
        }