Esempio n. 1
0
        private static void TraverseRecursive <T>(IGraph <T> graph, T vertex, IDFSTraversalVisitor <T> visitor, Dictionary <T, State> states)
        {
            states[vertex] = State.Discovered;
            visitor.DiscoverVertex(vertex, graph);

            foreach (var neighbour in graph.GetNeighbours(vertex))
            {
                var edge = new Edge <T>(vertex, neighbour);
                visitor.ExamineEdge(edge, graph);
                var neighbourState = states[neighbour];

                if (neighbourState == State.NotDiscovered)
                {
                    visitor.TreeEdge(edge, graph);
                    TraverseRecursive(graph, neighbour, visitor, states);
                }
                else if (neighbourState == State.Discovered)
                {
                    visitor.BackEdge(edge, graph);
                }

                visitor.FinishEdge(edge, graph);
            }

            states[vertex] = State.Closed;
            visitor.FinishVertex(vertex, graph);
        }
Esempio n. 2
0
        private static void Traverse <T>(IGraph <T> graph, T startVertex, IDFSTraversalVisitor <T> visitor, Dictionary <T, State> states)
        {
            var stack = new Stack <VertexInfo <T> >();

            stack.Push(new VertexInfo <T>(startVertex, graph.GetNeighbours(startVertex).GetEnumerator()));
            states[startVertex] = State.Discovered;
            visitor.DiscoverVertex(startVertex, graph);

            while (stack.Count != 0)
            {
                var vertexInfo         = stack.Peek();
                var vertex             = vertexInfo.Vertex;
                var neighboursIterator = vertexInfo.NeighboursIterator;

                if (vertexInfo.CurrentOutcomingEdge != null)
                {
                    visitor.FinishEdge(vertexInfo.CurrentOutcomingEdge, graph);
                }

                if (neighboursIterator.MoveNext())
                {
                    var neighbour      = neighboursIterator.Current;
                    var neighbourState = states[neighbour];
                    var edge           = new Edge <T>(vertex, neighbour);
                    vertexInfo.CurrentOutcomingEdge = edge;

                    if (neighbourState == State.NotDiscovered)
                    {
                        visitor.TreeEdge(edge, graph);
                        visitor.DiscoverVertex(neighbour, graph);
                        states[neighbour] = State.Discovered;

                        stack.Push(new VertexInfo <T>(neighbour, graph.GetNeighbours(neighbour).GetEnumerator()));
                    }
                    else if (neighbourState == State.Discovered)
                    {
                        visitor.BackEdge(edge, graph);
                        visitor.FinishEdge(edge, graph);
                    }
                }
                else
                {
                    stack.Pop();
                    visitor.FinishVertex(vertex, graph);
                    states[vertex] = State.Closed;
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Traverses a given graph in a DFS order, starting from a given vertex.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="graph"></param>
        /// <param name="startVertex"></param>
        /// <param name="visitor"></param>
        public static void Traverse <T>(IGraph <T> graph, T startVertex, IDFSTraversalVisitor <T> visitor)
        {
            var vertices = graph.Vertices.ToList();
            var states   = new Dictionary <T, State>();

            foreach (var vertex in vertices)
            {
                states.Add(vertex, State.NotDiscovered);
                visitor.InitializeVertex(vertex, graph);
            }

            visitor.StartVertex(startVertex, graph);
            Traverse(graph, startVertex, visitor, states);

            foreach (var vertex in vertices)
            {
                if (states[vertex] == State.NotDiscovered)
                {
                    visitor.StartVertex(vertex, graph);
                    Traverse(graph, vertex, visitor, states);
                }
            }
        }
Esempio n. 4
0
 /// <summary>
 /// Traverses a given graph in a DFS order.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="graph"></param>
 /// <param name="visitor"></param>
 public static void Traverse <T>(IGraph <T> graph, IDFSTraversalVisitor <T> visitor)
 {
     Traverse(graph, graph.Vertices.First(), visitor);
 }
Esempio n. 5
0
 internal static void TraverseRecursive <T>(IGraph <T> graph, IDFSTraversalVisitor <T> visitor)
 {
     TraverseRecursive(graph, graph.Vertices.First(), visitor);
 }