Провести для всех вершин графа обход в глубину - C#
Формулировка задачи:
Помогите!
Необходимо провести для всех вершин графа обход в глубину
вот сам граф
1
2 5 3 4
Решение задачи: «Провести для всех вершин графа обход в глубину»
textual
Листинг программы
using System; // Что стоит почитать по теме: //http://en.wikipedia.org/wiki/Depth-first_search //http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html //http://www.algolist.net/Algorithms/Graph/Undirected/Depth-first_search#cormen_book //Book: Data Structures and Algorithms in Java by Robert Lafore (Author) //"Java to C# converter" Copyright © 2007 - 2012 Tangible Software Solutions Inc. namespace GraphInDepth { class Program { // Дальше в комментариях материалы с разных сайтов # region Usefull_Source // Visit(v); // Mark(v); // for каждого ребра vw графа G do // if вершина w непомечена // DepthFirstTraversal(G,w); // end if; //end for; //// Обход графов в глубину //// На этом шаге мы рассмотрим алгоритм обхода графа в глубину. //// Обход в глубину (называемый иногда стандартным обходом), есть обход графа по следующим правилам: ////находясь в вершине x, нужно двигаться в любую другую, ранее не посещенную вершину (если таковая найдется), одновременно запоминая дугу, // по которой мы впервые попали в данную вершину; ////если из вершины x мы не можем попасть в ранее не посещенную вершину или таковой вообще нет, то мы возвращаемся в вершину z, // из которой впервые попали в x, и продолжаем обход в глубину из вершины z. //// При выполнении обхода графа по этим правилам мы стремимся проникнуть "вглубь" графа так далеко, как это возможно, // затем отступаем на шаг назад и снова стремимся пройти вперед и так далее. //// На этом шаге мы приведем рекурсивную функцию обхода графа в глубину. Граф представлен в памяти структурой Вирта. // В приведенной ниже формулировке нерекурсивного алгоритма поиска в глубину на графе [1,с.125-126] предполагается: //во-первых, что зафиксирован некоторый линейный порядок на множестве всех вершин графа, и, во-вторых, что множество вершин, //смежных со всякой вершиной графа, также линейно упорядочено. //while (Имеется хотя бы одна непосещенная вершина) //{ // Пусть p - первая из непосещенных вершин. // Посетить вершину p и поместить ее в пустой стек S; // while ( Стек S непуст ) // { // Пусть p - вершина, находящаяся на верхушке стека S; // if (У вершины p есть непосещенные смежные вершины) // { Пусть q - первая непосещенная вершина из вершин, смежных // вершине p. Пройти по ребру (p,q), посетить вершину q и // поместить ее в стек S } // else Удалить вершину p из стека S // } //} #endregion public class StackX { private readonly int SIZE = 20; private int[] st; private int top; public StackX() // constructor { st = new int[SIZE]; // make array top = -1; } public virtual void push(int j) // put item on stack { st[++top] = j; } public virtual int pop() // take item off stack { return st[top--]; } public virtual int peek() // peek at top of stack { return st[top]; } public virtual bool Empty { get { return (top == -1); } } } // end class StackX //////////////////////////////////////////////////////////////// public class Vertex { public char label; // label (e.g. 'A') public bool wasVisited; // ------------------ public Vertex(char lab) // constructor { label = lab; wasVisited = false; } // ------------------ } // end class Vertex //////////////////////////////////////////////////////////////// public class Graph { private readonly int MAX_VERTS = 20; private Vertex[] vertexList; // list of vertices private int[][] adjMat; // adjacency matrix private int nVerts; // current number of vertices private StackX theStack; // ------------------ public Graph() // constructor { vertexList = new Vertex[MAX_VERTS]; // adjacency matrix //ORIGINAL LINE: adjMat = new int[MAX_VERTS][MAX_VERTS]; //JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java: adjMat = RectangularArrays.ReturnRectangularIntArray(MAX_VERTS, MAX_VERTS); nVerts = 0; for (int j = 0; j < MAX_VERTS; j++) // set adjacency { for (int k = 0; k < MAX_VERTS; k++) // matrix to 0 { adjMat[j][k] = 0; } } theStack = new StackX(); } // end constructor // ------------------ public virtual void addVertex(char lab) { vertexList[nVerts++] = new Vertex(lab); } // ------------------ public virtual void addEdge(int start, int end) { adjMat[start][end] = 1; adjMat[end][start] = 1; } // ------------------ public virtual void displayVertex(int v) { Console.Write(vertexList[v].label); } // ------------------ public virtual void dfs() // depth-first search { // begin at vertex 0 vertexList[0].wasVisited = true; // mark it displayVertex(0); // display it theStack.push(0); // push it while (!theStack.Empty) // until stack empty, { // get an unvisited vertex adjacent to stack top int v = getAdjUnvisitedVertex(theStack.peek()); if (v == -1) // if no such vertex, { theStack.pop(); } else // if it exists, { vertexList[v].wasVisited = true; // mark it displayVertex(v); // display it theStack.push(v); // push it } } // end while // stack is empty, so we're done for (int j = 0; j < nVerts; j++) // reset flags { vertexList[j].wasVisited = false; } } // end dfs // ------------------ // returns an unvisited vertex adj to v public virtual int getAdjUnvisitedVertex(int v) { for (int j = 0; j < nVerts; j++) { if (adjMat[v][j] == 1 && vertexList[j].wasVisited == false) { return j; } } return -1; } // end getAdjUnvisitedVert() // ------------------ } // end class Graph //////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------- // Copyright © 2007 - 2012 Tangible Software Solutions Inc. // This class can be used by anyone provided that the copyright notice remains intact. // // This class provides the logic to simulate Java rectangular arrays, which are jagged // arrays with inner arrays of the same length. //---------------------------------------------------------------------------------------- internal static partial class RectangularArrays { internal static int[][] ReturnRectangularIntArray(int Size1, int Size2) { int[][] Array = new int[Size1][]; for (int Array1 = 0; Array1 < Size1; Array1++) { Array[Array1] = new int[Size2]; } return Array; } } public static void Main(string[] args) { Graph theGraph = new Graph(); theGraph.addVertex('1'); // 0 (start for dfs) theGraph.addVertex('2'); // 1 theGraph.addVertex('3'); // 2 theGraph.addVertex('4'); // 3 theGraph.addVertex('5'); // 4 theGraph.addEdge(0, 1); // 1-2 theGraph.addEdge(1, 4); // 2-5 theGraph.addEdge(4, 2); // 5-3 theGraph.addEdge(2, 3); // 3-4 Console.Write("Visits: "); theGraph.dfs(); // depth-first search Console.WriteLine(); Console.ReadKey(); } // end main() } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д