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); } }