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