Tvor0zhok

СиАКОД Графы 1 и 2

Mar 29th, 2022 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.74 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4.  
  5. namespace Example
  6. {
  7. class Program
  8. {
  9. static void Main()
  10. {
  11. Graph g = new Graph("C:/Users/contest.W12-418-05/Desktop/input.txt");
  12. g.Show();
  13.  
  14. // ЗАДАНИЕ 1
  15.  
  16. Console.Write("v1 = ");
  17. int v1 = int.Parse(Console.ReadLine());
  18.  
  19. Console.WriteLine("Число вершин, смежных с вершиной v1 = {0}", g.AdjacentVertices(v1));
  20.  
  21. // ЗАДАНИЕ 2
  22.  
  23. Console.Write("v2 = ");
  24. int v2 = int.Parse(Console.ReadLine());
  25. if (v2 < 1 || v2 > g.Size) throw new Exception("Вершины v2 в графе нет"); --v2;
  26.  
  27. Console.Write("Достижимые вершины (1-ая вершина = v2, на нее можно не смотреть): ");
  28. g.DFS(v2);
  29. }
  30. };
  31.  
  32. public class Graph
  33. {
  34. private class Node //вложенный класс для скрытия данных и алгоритмов
  35. {
  36. private int[,] array; //матрица смежности
  37. public int this[int i, int j] //индексатор для обращения к матрице смежности
  38. {
  39. get
  40. {
  41. return array[i, j];
  42. }
  43. set
  44. {
  45. array[i, j] = value;
  46. }
  47. }
  48.  
  49. public int Size //свойство для получения размерности матрицы смежности
  50. {
  51. get
  52. {
  53. return array.GetLength(0);
  54. }
  55. }
  56.  
  57. private bool[] nov; // вспомогательный массив:
  58. // nov[v] = true <=> вершина НЕ просмотрена
  59. // nov[v] = false <=> вершина просмотрена
  60.  
  61. public void NovSet() //метод помечает все вершины графа как непросмотреные
  62. {
  63. for (int i = 0; i < Size; i++)
  64. {
  65. nov[i] = true;
  66. }
  67. }
  68.  
  69. // конструктор вложенного класса, инициализирует матрицу смежности и
  70. // вспомогательный массив
  71. public Node(int[,] a)
  72. {
  73. array = a;
  74. nov = new bool[a.GetLength(0)];
  75. }
  76.  
  77. // подсчет кол-ва смежных вершин
  78. public int AdjacentVertices (int v)
  79. {
  80. if (v < 1 || v > Size)
  81. throw new Exception("Вершины v в графе нет");
  82. else
  83. {
  84. int res = 0;
  85. --v;
  86.  
  87. for (int to = 0; to < Size; ++to)
  88. if (array[v, to] == 1) ++res;
  89.  
  90. return res;
  91. }
  92. }
  93.  
  94. //реализация алгоритма обхода графа в глубину
  95. public void DFS(int v)
  96. {
  97. Console.Write("{0} ", v + 1); // просматриваем текущую вершину
  98. nov[v] = false; // помечаем ее как просмотренную
  99.  
  100. for (int u = 0; u < Size; u++) // в матрице смежности просматриваем строку с номером v
  101. {
  102. //если вершины v и u смежные, к тому же вершина u не просмотрена,
  103. if (array[v, u] != 0 && nov[u])
  104. DFS(u); // то рекурсивно просматриваем вершину
  105. }
  106. }
  107.  
  108. //реализация алгоритма обхода графа в ширину
  109. public void BFS(int v)
  110. {
  111. Queue <int> q = new Queue <int>(); // инициализируем очередь
  112. q.Enqueue(v); // помещаем вершину v в очередь
  113. nov[v] = false; // помечаем вершину v как просмотренную
  114.  
  115. while (q.Count != 0) // пока очередь не пуста
  116. {
  117. v = q.Dequeue(); // извлекаем вершину из очереди
  118. Console.Write("{0} ", v); // просматриваем ее
  119.  
  120. for (int u = 0; u < Size; u++) // находим все вершины
  121. {
  122. if (array[v, u] != 0 && nov[u]) // смежные с данной и еще не просмотренные
  123. {
  124. q.Enqueue(u); // помещаем их в очередь
  125. nov[u] = false; // и помечаем как просмотренные
  126. }
  127. }
  128. }
  129. }
  130. } //конец вложенного клаcса
  131.  
  132. private Node graph; // закрытое поле, реализующее АТД «граф»
  133.  
  134. public int Size // свойство для получения размерности матрицы смежности
  135. {
  136. get
  137. {
  138. return graph.Size;
  139. }
  140. }
  141.  
  142. public Graph(string name) //конструктор внешнего класса
  143. {
  144. using (StreamReader file = new StreamReader(name))
  145. {
  146. int n = int.Parse(file.ReadLine());
  147. int[,] a = new int[n, n];
  148.  
  149. for (int i = 0; i < n; i++)
  150. {
  151. string line = file.ReadLine();
  152. string[] mas = line.Split(", ");
  153.  
  154. for (int j = 0; j < n; j++)
  155. {
  156. a[i, j] = int.Parse(mas[j]);
  157. }
  158. }
  159.  
  160. graph = new Node(a);
  161. }
  162. }
  163.  
  164. //метод выводит матрицу смежности на консольное окно
  165. public void Show()
  166. {
  167. Console.WriteLine("n = {0}", graph.Size);
  168.  
  169. for (int i = 0; i < graph.Size; i++)
  170. {
  171. for (int j = 0; j < graph.Size; j++)
  172. {
  173. Console.Write("{0, -4}", graph[i, j]);
  174. }
  175.  
  176. Console.WriteLine();
  177. }
  178. }
  179.  
  180. public int AdjacentVertices(int v)
  181. {
  182. return graph.AdjacentVertices(v);
  183. }
  184.  
  185. public void DFS(int v)
  186. {
  187. graph.NovSet(); // помечаем все вершины графа как непросмотренные
  188. graph.DFS(v); // запускаем алгоритм обхода графа в глубину
  189. Console.WriteLine();
  190. }
  191.  
  192. public void BFS(int v)
  193. {
  194. graph.NovSet(); // помечаем все вершины графа как непросмотренные
  195. graph.BFS(v); // запускаем алгоритм обхода графа в ширину
  196. Console.WriteLine();
  197. }
  198. }
  199. }
Add Comment
Please, Sign In to add comment