public AlgorithmResult Run(IGraph graph, IAlgorithmHost host)
        {
            if (graph.Vertices.Count() == 0)
            {
                return(new AlgorithmResult(false, false));
            }

            var selectedVertex = host.GetSelectedVertex();

            var dfs = new Helpers.DepthFirstSearch(graph)
            {
                ProcessEdge = (v1, v2) =>
                {
                    if (v2.Color != VertexColor.Gray)
                    {
                        graph.ChangeColor(v2, VertexColor.Gray);
                        host.ShowCommentForLastAction($"Edge connected vertices {v1.Index} and {v2.Index} exists. Add vertex {v2.Index} to stack.");
                        host.AddToTableForLastAction(v2.Index.ToString());
                    }
                },
                ProcessVertexLate = (v) =>
                {
                    graph.ChangeColor(v, VertexColor.Black);
                    host.ShowCommentForLastAction($"Vertex {v.Index} has not unvisited adjacent vertices.");
                    host.ShowComment("Returns to last vertex.");
                    host.RemoveRowFromTableForLastAction(v.Index.ToString());
                }
            };

            graph.ChangeColor(selectedVertex, VertexColor.Gray);
            host.ShowCommentForLastAction($"Start DFS from vertex {selectedVertex.Index}.");
            host.AddToTableForLastAction(selectedVertex.Index.ToString());

            dfs.Run(selectedVertex);
            host.ShowComment("DFS has been finished.");

            return(new AlgorithmResult());
        }
        public AlgorithmResult Run(IGraph graph, IAlgorithmHost host)
        {
            if (graph.Vertices.Count() == 0)
            {
                host.Output.WriteLine("Graph is Empty.");
                return(new AlgorithmResult(false, false));
            }

            var selectedVertex = host.GetSelectedVertex();

            var bfs = new Helpers.BreadthFirstSearch(graph)
            {
                ProcessChild = (vParent, vChild) =>
                {
                    graph.ChangeColor(vChild, VertexColor.Gray);
                    host.ShowCommentForLastAction($"Edge connected vertices {vParent.Index} and {vChild.Index} exists. Add vertex {vChild.Index} to queue.");
                    host.AddToTableForLastAction(vChild.Index.ToString());
                },
                ProcessVertexLate = (v) =>
                {
                    graph.ChangeColor(v, VertexColor.Black);
                    host.ShowCommentForLastAction($"Vertex {v.Index} has not unvisited adjacent vertices.");
                    host.ShowComment($"Remove vertex {v.Index} from queue.");
                    host.RemoveRowFromTableForLastAction(v.Index.ToString());
                }
            };

            graph.ChangeColor(selectedVertex, VertexColor.Gray);
            host.ShowCommentForLastAction($"Start BFS from vertex {selectedVertex.Index}.");
            host.AddToTableForLastAction(selectedVertex.Index.ToString());

            bfs.Run(selectedVertex);
            host.ShowComment("BFS has been finished.");

            return(new AlgorithmResult());
        }