Exemplo n.º 1
0
        private static void Main(string[] args)
        {
            Console.WriteLine("Обработка графа из файла input.txt...");
            ProcessInputGraph();
            Console.WriteLine("\n\n");

            try
            {
                var rand          = new Random();
                var testGenerator = new TestGenerator();
                for (var i = 0; i < 10; i++)
                {
                    Console.ForegroundColor = ConsoleColor.DarkMagenta;
                    Console.WriteLine(i + 1 + "-й тест\n");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    testGenerator.GenerateNewIncidenceMatrix(ref rand);
                    var matrix = testGenerator.IncidenceMatrix;
                    PrintMatrix(matrix);
                    Console.WriteLine("Пример цикла: " + testGenerator.ExampleCycle);
                    Console.WriteLine("Найденный цикл: " + new EulerCycleFinder(matrix).GetEulerCycle());
                    Console.WriteLine("\n\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("Программа завершена успешно. Нажмите любую клавишу, чтобы выйти...");
            Console.ReadLine();
        }
        public string GetEulerCycle()
        {
            if (!AllDegreesAreEven())
            {
                throw new FormatException("Не все степени вершин четные, поэтому эйлерова цикла в графе нет.");
            }

            var height    = _matrix.GetLength(0);
            var width     = _matrix.GetLength(1);
            var edgeIndex = 0;
            var nodeIndex = FindNextNode();
            var cycle     = new StringBuilder(TestGenerator.GenerateName(nodeIndex));

            while (edgeIndex >= 0)
            {
                nodeIndex = FindNextNode();
                if (nodeIndex < 0)
                {
                    throw new FormatException("Матрица инцидентности введена некорректно.");
                }
                cycle.Append("-" + TestGenerator.GenerateName(nodeIndex));
                edgeIndex = FindNextEdge();
            }

            return(_matrix.Cast <bool>().Any(item => item)
                ? throw new FormatException("Цикла нет, так как граф задан неправильно или не является эйлеровым.")
                : cycle.ToString());


            int FindNextNode()
            {
                var next = -1;

                for (var i = 0; i < height; i++)
                {
                    if (_matrix[i, edgeIndex])
                    {
                        next = i;
                        _matrix[i, edgeIndex] = false;
                        break;
                    }
                }
                return(next);
            }

            int FindNextEdge()
            {
                var next = -1;

                for (var i = 0; i < width; i++)
                {
                    if (_matrix[nodeIndex, i])
                    {
                        next = i;
                        _matrix[nodeIndex, i] = false;
                        break;
                    }
                }
                return(next);
            }
        }