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); } }
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); }
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); } } }
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); } } } } }
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); } }