Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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);
 }