Провести для всех вершин графа обход в глубину - C#

Узнай цену своей работы

Формулировка задачи:

Помогите! Необходимо провести для всех вершин графа обход в глубину вот сам граф 1 2 5 3 4

Решение задачи: «Провести для всех вершин графа обход в глубину»

textual
Листинг программы
  1. using System;
  2.  
  3. // Что стоит почитать по теме:
  4. //http://en.wikipedia.org/wiki/Depth-first_search
  5. //http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html
  6. //http://www.algolist.net/Algorithms/Graph/Undirected/Depth-first_search#cormen_book
  7. //Book: Data Structures and Algorithms in Java by Robert Lafore (Author)
  8. //"Java to C# converter" Copyright © 2007 - 2012 Tangible Software Solutions Inc.
  9.  
  10. namespace GraphInDepth
  11. {
  12.  
  13.  
  14.     class Program
  15.     {
  16.      
  17. // Дальше в комментариях  материалы с разных сайтов
  18. # region Usefull_Source
  19.    
  20.   //     Visit(v);
  21.      //     Mark(v);
  22.      // for каждого ребра vw графа G do
  23.      //  if вершина w непомечена
  24.      //      DepthFirstTraversal(G,w);
  25.      //   end if;
  26.      //end for;
  27.      
  28.  
  29.  
  30.  
  31. ////            Обход графов в глубину
  32. ////    На этом шаге мы рассмотрим алгоритм обхода графа в глубину.
  33.  
  34. ////    Обход в глубину (называемый иногда стандартным обходом), есть обход графа по следующим правилам:
  35.  
  36. ////находясь в вершине x, нужно двигаться в любую другую, ранее не посещенную вершину (если таковая найдется), одновременно запоминая дугу,
  37. //            по которой мы впервые попали в данную вершину;
  38. ////если из вершины x мы не можем попасть в ранее не посещенную вершину или таковой вообще нет, то мы возвращаемся в вершину z,
  39. //            из которой впервые попали в x, и продолжаем обход в глубину из вершины z.
  40. ////    При выполнении обхода графа по этим правилам мы стремимся проникнуть "вглубь" графа так далеко, как это возможно,
  41. //            затем отступаем на шаг назад и снова стремимся пройти вперед и так далее.
  42.  
  43. ////    На этом шаге мы приведем рекурсивную функцию обхода графа в глубину. Граф представлен в памяти структурой Вирта.
  44.  
  45.  
  46.             // В приведенной ниже формулировке нерекурсивного алгоритма поиска в глубину на графе [1,с.125-126] предполагается:
  47.             //во-первых, что зафиксирован некоторый линейный порядок на множестве всех вершин графа, и, во-вторых, что множество вершин,
  48.             //смежных со всякой вершиной графа, также линейно упорядочено.
  49.  
  50.             //while (Имеется хотя бы одна непосещенная вершина)
  51.             //{
  52.             //  Пусть p - первая из непосещенных вершин.
  53.             //  Посетить вершину p и поместить ее в пустой стек S;
  54.             //  while ( Стек S непуст )
  55.             //  {
  56.             //    Пусть p - вершина, находящаяся на верхушке стека S;
  57.             //    if (У вершины p есть непосещенные смежные вершины)
  58.             //      { Пусть q - первая непосещенная вершина из вершин, смежных
  59.             //        вершине p. Пройти по ребру (p,q), посетить вершину q и
  60.             //        поместить ее в стек S }
  61.             //    else Удалить вершину p из стека S
  62.             //  }
  63.             //}
  64.  
  65.  
  66.  
  67. #endregion
  68.      
  69. public class StackX
  70. {
  71. private readonly int SIZE = 20;
  72. private int[] st;
  73. private int top;
  74. public StackX() // constructor
  75. {
  76. st = new int[SIZE]; // make array
  77. top = -1;
  78. }
  79. public virtual void push(int j) // put item on stack
  80. {
  81.     st[++top] = j;
  82. }
  83. public virtual int pop() // take item off stack
  84. {
  85.     return st[top--];
  86. }
  87. public virtual int peek() // peek at top of stack
  88. {
  89.     return st[top];
  90. }
  91. public virtual bool Empty
  92. {
  93.     get
  94.     {
  95.         return (top == -1);
  96.     }
  97. }
  98. } // end class StackX
  99. ////////////////////////////////////////////////////////////////
  100.  
  101.        
  102. public class Vertex
  103. {
  104. public char label; // label (e.g. 'A')
  105. public bool wasVisited;
  106. // ------------------
  107. public Vertex(char lab) // constructor
  108. {
  109. label = lab;
  110. wasVisited = false;
  111. }
  112. // ------------------
  113. } // end class Vertex
  114. ////////////////////////////////////////////////////////////////
  115.  
  116.                
  117. public class Graph
  118. {
  119. private readonly int MAX_VERTS = 20;
  120. private Vertex[] vertexList; // list of vertices
  121. private int[][] adjMat; // adjacency matrix
  122. private int nVerts; // current number of vertices
  123. private StackX theStack;
  124. // ------------------
  125. public Graph() // constructor
  126. {
  127. vertexList = new Vertex[MAX_VERTS];
  128. // adjacency matrix
  129. //ORIGINAL LINE: adjMat = new int[MAX_VERTS][MAX_VERTS];
  130. //JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
  131. adjMat = RectangularArrays.ReturnRectangularIntArray(MAX_VERTS, MAX_VERTS);
  132. nVerts = 0;
  133. for (int j = 0; j < MAX_VERTS; j++) // set adjacency
  134. {
  135. for (int k = 0; k < MAX_VERTS; k++) // matrix to 0
  136. {
  137. adjMat[j][k] = 0;
  138. }
  139. }
  140. theStack = new StackX();
  141. } // end constructor
  142. // ------------------
  143. public virtual void addVertex(char lab)
  144. {
  145. vertexList[nVerts++] = new Vertex(lab);
  146. }
  147. // ------------------
  148. public virtual void addEdge(int start, int end)
  149. {
  150. adjMat[start][end] = 1;
  151. adjMat[end][start] = 1;
  152. }
  153. // ------------------
  154. public virtual void displayVertex(int v)
  155. {
  156. Console.Write(vertexList[v].label);
  157. }
  158. // ------------------
  159. public virtual void dfs() // depth-first search
  160. { // begin at vertex 0
  161. vertexList[0].wasVisited = true; // mark it
  162. displayVertex(0); // display it
  163. theStack.push(0); // push it
  164. while (!theStack.Empty) // until stack empty,
  165. {
  166. // get an unvisited vertex adjacent to stack top
  167. int v = getAdjUnvisitedVertex(theStack.peek());
  168. if (v == -1) // if no such vertex,
  169. {
  170. theStack.pop();
  171. }
  172. else // if it exists,
  173. {
  174. vertexList[v].wasVisited = true; // mark it
  175. displayVertex(v); // display it
  176. theStack.push(v); // push it
  177. }
  178. } // end while
  179. // stack is empty, so we're done
  180. for (int j = 0; j < nVerts; j++) // reset flags
  181. {
  182. vertexList[j].wasVisited = false;
  183. }
  184. } // end dfs
  185. // ------------------
  186. // returns an unvisited vertex adj to v
  187. public virtual int getAdjUnvisitedVertex(int v)
  188. {
  189. for (int j = 0; j < nVerts; j++)
  190. {
  191. if (adjMat[v][j] == 1 && vertexList[j].wasVisited == false)
  192. {
  193. return j;
  194. }
  195. }
  196. return -1;
  197. } // end getAdjUnvisitedVert()
  198. // ------------------
  199.  
  200. } // end class Graph
  201. ////////////////////////////////////////////////////////////////
  202.  
  203.  
  204. //----------------------------------------------------------------------------------------
  205. //  Copyright © 2007 - 2012 Tangible Software Solutions Inc.
  206. //  This class can be used by anyone provided that the copyright notice remains intact.
  207. //
  208. //  This class provides the logic to simulate Java rectangular arrays, which are jagged
  209. //  arrays with inner arrays of the same length.
  210. //----------------------------------------------------------------------------------------
  211.  
  212. internal static partial class RectangularArrays
  213. {
  214.     internal static int[][] ReturnRectangularIntArray(int Size1, int Size2)
  215.     {
  216.         int[][] Array = new int[Size1][];
  217.         for (int Array1 = 0; Array1 < Size1; Array1++)
  218.         {
  219.             Array[Array1] = new int[Size2];
  220.         }
  221.         return Array;
  222.     }
  223. }
  224.  
  225. public static void Main(string[] args)
  226. {
  227. Graph theGraph = new Graph();
  228. theGraph.addVertex('1'); // 0 (start for dfs)
  229. theGraph.addVertex('2'); // 1
  230. theGraph.addVertex('3'); // 2
  231. theGraph.addVertex('4'); // 3
  232. theGraph.addVertex('5'); // 4
  233. theGraph.addEdge(0, 1); // 1-2
  234. theGraph.addEdge(1, 4); // 2-5
  235. theGraph.addEdge(4, 2); // 5-3
  236. theGraph.addEdge(2, 3); // 3-4
  237. Console.Write("Visits: ");
  238. theGraph.dfs(); // depth-first search
  239. Console.WriteLine();
  240.     Console.ReadKey();
  241. } // end main()
  242.  
  243.     }
  244. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы