GraphIO.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO; // Добавьте это пространство имен
  4. using System.Linq;
  5. // Класс для ввода/вывода графа
  6. static class GraphIO
  7. {
  8. static readonly Dictionary<char, int> CharToVertexId = GraphIoUtilities.GenerateCharToVertexId();
  9. static readonly Dictionary<int, char> VertexIdToChar = GraphIoUtilities.GenerateVertexIdToChar();
  10. static public Graph InputGraphFromConsole()
  11. {
  12. Console.WriteLine("Запущен ввод графа через консоль.");
  13. Console.Write("Использовать буквы для названия вершин (ДА/НЕТ): ");
  14. string answer = Console.ReadLine();
  15. bool useLetters = false;
  16. if (answer.ToLower() == "да")
  17. {
  18. useLetters = true;
  19. }
  20. int verticesAmount = -1;
  21. while (verticesAmount < 0)
  22. {
  23. try
  24. {
  25. Console.Write("Введите количество вершин: ");
  26. verticesAmount = Convert.ToInt32(Console.ReadLine());
  27. }
  28. catch (Exception)
  29. {
  30. Console.WriteLine("Количество вершин должно быть целым числом без лишних знаков.");
  31. }
  32. }
  33. Graph graph = new Graph();
  34. for (int i = 1; i <= verticesAmount; i++)
  35. {
  36. Vertex vertex = new Vertex(i);
  37. graph.AddVertex(vertex);
  38. }
  39. for (int i = 1; i <= verticesAmount; i++)
  40. {
  41. while (true)
  42. {
  43. try
  44. {
  45. if (useLetters)
  46. {
  47. Console.WriteLine($"[] Вершина [{VertexIdToChar[i]}]");
  48. }
  49. else
  50. {
  51. Console.WriteLine($"[] Вершина [{i}]");
  52. }
  53. Console.Write("Введите количество ребер этой вершины: ");
  54. int edgesAmount = Convert.ToInt32(Console.ReadLine());
  55. for (int j = 1; j <= edgesAmount; j++)
  56. {
  57. int targetVertexId, distance;
  58. Console.WriteLine("- Ребро");
  59. if (useLetters)
  60. {
  61. char fromLetter = VertexIdToChar[i];
  62. Console.WriteLine($"Начальная вершина: [{fromLetter}]");
  63. Console.Write($"Конечная вершина: ");
  64. char targetVertexLetter = Convert.ToChar(Console.ReadLine());
  65. targetVertexId = CharToVertexId[targetVertexLetter];
  66. }
  67. else
  68. {
  69. Console.WriteLine($"Начальная вершина: [{i}]");
  70. Console.Write($"Конечная вершина: ");
  71. targetVertexId = Convert.ToInt32(Console.ReadLine());
  72. }
  73. Console.Write($"Расстояние: ");
  74. distance = Convert.ToInt32(Console.ReadLine());
  75. Edge edge = new Edge(from: graph.Vertices[i - 1], to: graph.Vertices[targetVertexId - 1], distance: distance);
  76. graph.Vertices[i - 1].AddEdge(edge);
  77. }
  78. Console.Write("Повторить попытку ввода ребер этой вершины (ДА/НЕТ): ");
  79. answer = Console.ReadLine();
  80. if (answer.ToLower() != "да")
  81. {
  82. Console.WriteLine();
  83. break;
  84. }
  85. }
  86. catch (Exception)
  87. {
  88. Console.WriteLine("Возникла ошибка, необходимо повторить ввод для этой вершины.");
  89. }
  90. Console.WriteLine();
  91. }
  92. }
  93. return graph;
  94. }
  95. // Метод для чтения матрицы из файла
  96. private static int[,] ReadMatrixFromFile(string filePath)
  97. {
  98. var lines = File.ReadAllLines(filePath);
  99. int size = lines.Length;
  100. int[,] matrix = new int[size, size];
  101. for (int i = 0; i < size; i++)
  102. {
  103. var values = lines[i].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
  104. .Select(v => int.Parse(v.Trim()))
  105. .ToArray();
  106. for (int j = 0; j < values.Length; j++)
  107. {
  108. matrix[i, j] = values[j];
  109. }
  110. }
  111. return matrix;
  112. }
  113. static public Graph InputGraphFromManual()
  114. {
  115. string filePath = "C:\\Users\\admin\\Колледж\\Работы3курс\\МОДУЛЬНЫЙ\\DijkstraMethodKuzmin\\DijkstraMethod\\test.txt";
  116. int[,] matrix = ReadMatrixFromFile(filePath);
  117. Graph graph = new Graph(matrix);
  118. return graph;
  119. }
  120. public static Graph InputGraphFromTetradka()
  121. {
  122. // А Б В Г Д Е Ж З И К
  123. int[,] adjacencyMatrix = new int[,] { { 0, 20, 25, 30, 0, 0, 0, 0, 0, 0 },
  124. { 20, 0, 0, 5, 0, 10, 0, 0, 0, 0 },
  125. { 25, 0, 0, 0, 0, 10, 15, 0, 0, 0 },
  126. { 30, 5, 0, 0, 25, 0, 0, 0, 0, 0 },
  127. { 0, 0, 0, 25, 0, 15, 0, 5, 10, 20 },
  128. { 0, 10, 10, 0, 15, 0, 10, 0, 0, 0 },
  129. { 0, 0, 15, 0, 0, 10, 0, 15, 0, 0 },
  130. { 0, 0, 0, 0, 5, 0, 15, 0, 0, 10 },
  131. { 0, 0, 0, 0, 10, 0, 0, 0, 0, 10 },
  132. { 0, 0, 0, 0, 20, 0, 0, 10, 10, 0 }
  133. };
  134. Graph graph = new Graph(adjacencyMatrix);
  135. return graph;
  136. }
  137. }