/// <summary> /// Traverses graph from start vertex. /// </summary> /// <param name="graph">Graph instance.</param> /// <param name="startVertex">Vertex that search starts from.</param> /// <param name="action">Action that needs to be executed on each graph vertex.</param> /// <param name="visited">Hash set with visited vertices.</param> private void Bfs(IDirectedWeightedGraph <T> graph, Vertex <T> startVertex, Action <Vertex <T> >?action, HashSet <Vertex <T> > visited) { var queue = new Queue <Vertex <T> >(); queue.Enqueue(startVertex); while (queue.Count > 0) { var currentVertex = queue.Dequeue(); if (currentVertex == null || visited.Contains(currentVertex)) { continue; } foreach (var vertex in graph.GetNeighbors(currentVertex)) { queue.Enqueue(vertex !); } action?.Invoke(currentVertex); visited.Add(currentVertex); } }
/// <summary> /// Traverses graph from start vertex. /// </summary> /// <param name="graph">Graph instance.</param> /// <param name="startVertex">Vertex that search starts from.</param> /// <param name="action">Action that needs to be executed on each graph vertex.</param> /// <param name="visited">Hash set with visited vertices.</param> private void Dfs(IDirectedWeightedGraph <T> graph, Vertex <T> startVertex, Action <Vertex <T> >?action, HashSet <Vertex <T> > visited) { action?.Invoke(startVertex); visited.Add(startVertex); foreach (var vertex in graph.GetNeighbors(startVertex)) { if (vertex == null || visited.Contains(vertex)) { continue; } Dfs(graph, vertex !, action, visited); } }