private DfsParenthesisVertice <T> CreateWhite(DfsVertice <T> vertice)
 {
     return(new DfsParenthesisVertice <T>()
     {
         IsWhite = true,
         Timestamp = vertice.DiscoveredTimestamp,
         Vertice = vertice.Vertice
     });
 }
 private DfsParenthesisVertice <T> CreateBlack(DfsVertice <T> vertice)
 {
     return(new DfsParenthesisVertice <T>()
     {
         IsWhite = false,
         Timestamp = vertice.TraversedTimestamp,
         Vertice = vertice.Vertice
     });
 }
        public bool Equals(DfsVertice <T> other)
        {
            var comparer = EqualityComparer <T> .Default;

            return
                (comparer.Equals(this.Vertice, other.Vertice) &&
                 comparer.Equals(this.Predescessor, other.Predescessor) &&
                 this.DiscoveredTimestamp == other.DiscoveredTimestamp &&
                 this.TraversedTimestamp == other.TraversedTimestamp);
        }
        public IEnumerator <DfsVertice <T> > GetEnumerator()
        {
            var visited   = new Dictionary <T, VerticeColor>();
            var stack     = new Stack <DfsVertice <T> >();
            var timestamp = 0;

            var source = new DfsVertice <T>(_source, default(T));

            source.DiscoveredTimestamp = timestamp++;

            stack.Push(source);

            while (stack.Count > 0)
            {
                var vertice = stack.Pop();
                var color   = VerticeColor.White;

                visited.TryGetValue(vertice.Vertice, out color);

                switch (color)
                {
                case VerticeColor.White:
                    visited[vertice.Vertice]    = VerticeColor.Gray;
                    vertice.DiscoveredTimestamp = timestamp++;
                    stack.Push(vertice);

                    foreach (var adjacentVertice in _graph.GetAdjacentVertices(vertice.Vertice))
                    {
                        var adjacentColor = VerticeColor.White;
                        visited.TryGetValue(adjacentVertice, out adjacentColor);

                        if (adjacentColor == VerticeColor.White)
                        {
                            stack.Push(new DfsVertice <T>(adjacentVertice, vertice.Vertice));
                        }
                    }
                    break;

                case VerticeColor.Gray:
                    visited[vertice.Vertice] = VerticeColor.Black;
                    stack.Push(vertice);
                    break;

                case VerticeColor.Black:
                    vertice.TraversedTimestamp = timestamp++;
                    yield return(vertice);

                    break;
                }
            }
        }