/// <summary> /// Поиск (обход) графа в глубину /// </summary> /// <param name="id">Искомое значение</param> /// <returns>true, если вершина с таким значением есть в графе</returns> public bool DFS(int id) { GraphPrinter.ClearText();//Очищаем текстовый буфер печатальщика bool isFound = DFS(id, this.Nodes[0]); ColorPrint("Поиск завершен"); Console.WriteLine(); return(isFound); }
/// <summary> /// Поиск (обход) графа в ширину /// </summary> /// <param name="id">Искомое значение</param> /// <returns>true, если вершина с таким значением есть в графе</returns> public bool BFS(int id) { GraphPrinter.ClearText(); //Очищаем текстовый буфер печатальщика Queue <Node> bufer = new Queue <Node>(); //Сюда будут заносится вершины для последующей проверки bufer.Enqueue(this.Nodes[0]); //Обход начинаем с 0-й вершины bool isFound = false; //Повторяем до тех пор пока не найдем или пока не кончатся вершины while (bufer.Count != 0 && !isFound) { Node element = bufer.Dequeue();//Достаем элемент из очереди if (element.ID == id) { isFound = true; //Если это нужны элемент то радуемся } //Выставляем флаг проверки того, что элемент обрабатывается или найден //ПУРПУРНЫЙ - элемент в процессе обработки //ЗЕЛЕНЫЙ - элемент обработан и совпадает с искомым значением element.State = isFound ? Node.Status.founded : Node.Status.in_process; ColorPrint($"Проверяемая вершина: {element.ID}"); if (!isFound)//Если не нашли значение то добавляем сопряженные вершины в очередь на проверку { foreach (Edge edge in element.Edges) { if (edge.ConnectedNode.State == Node.Status.not_processed) { //ЖЕЛТЫЙ - элемент помещается в очередь для последующей обработки edge.ConnectedNode.State = Node.Status.marked_to_process; bufer.Enqueue(edge.ConnectedNode); ColorPrint($"Вершина {edge.ConnectedNode.ID} идет в очередь"); } } //КРАСНЫЙ - элемент обработан element.State = Node.Status.processed; } } ColorPrint("Поиск завершен"); Console.WriteLine(); return(isFound); }
/// <summary>Вызов печати графаы</summary> /// <param name="graph"></param> /// <param name="isColorsClear"></param> private static void Print(Graph graph, bool isColorsClear = true) { Console.Clear(); GraphPrinter.ClearText(); GraphPrinter.Print(graph, isColorsClear); }