Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.67 KB | None | 0 0
  1. using System;
  2.  
  3.  
  4. namespace Graph
  5. {
  6.  
  7.  
  8.     class Program
  9.     {
  10.  
  11.  
  12. // псевдокод
  13.         //     Visit(v);
  14.         //     Mark(v);
  15.         // for каждого ребра vw графа G do
  16.         //  if вершина w неактивирована
  17.         //      DepthFirstTraversal(G,w);
  18.         //   end if;
  19.         //end for;
  20.  
  21.  
  22.  
  23.  
  24.  
  25.         ////    Обход в глубину (называемый иногда стандартным обходом), есть обход графа по следующим правилам:
  26.  
  27.         ////находясь в вершине x, нужно двигаться в любую другую, ранее не посещенную вершину (если таковая найдется), одновременно запоминая дугу,
  28.         //            по которой мы впервые попали в данную вершину;
  29.         ////если из вершины x мы не можем попасть в ранее не посещенную вершину или таковой вообще нет, то мы возвращаемся в вершину z,
  30.         //            из которой впервые попали в x, и продолжаем обход в глубину из вершины z.
  31.         ////    При выполнении обхода графа по этим правилам мы стремимся проникнуть "вглубь" графа так далеко, как это возможно,
  32.         //            затем отступаем на шаг назад и снова стремимся пройти вперед и так далее.
  33.  
  34.         ////    На этом шаге мы приведем рекурсивную функцию обхода графа в глубину. Граф представлен в памяти структурой Вирта.
  35.  
  36.  
  37.         // В приведенной ниже формулировке нерекурсивного алгоритма поиска в глубину на графе [1,с.125-126] предполагается:
  38.         //во-первых, что зафиксирован некоторый линейный порядок на множестве всех вершин графа, и, во-вторых, что множество вершин,
  39.         //смежных со всякой вершиной графа, также линейно упорядочено.
  40.  
  41.         //while (Имеется хотя бы одна неактивированая вершина)
  42.         //{
  43.         //  Пусть p - первая из неактивированых вершин.
  44.         //  Посетить вершину p и поместить ее в пустой стек S;
  45.         //  while ( Стек S непуст )
  46.         //  {
  47.         //    Пусть p - вершина, находящаяся на верхушке стека S;
  48.         //    if (У вершины p есть неактивированные смежные вершины)
  49.         //      { Пусть q - первая неактивированая вершина из вершин, смежных
  50.         //        вершине p. Пройти по ребру (p,q), посетить вершину q и
  51.         //        поместить ее в стек S }
  52.         //    else Удалить вершину p из стека S
  53.         //  }
  54.         //}
  55.  
  56.  
  57.         public class StackX
  58.         {
  59.             private readonly int SIZE = 20;
  60.             private int[] st;
  61.             private int top;
  62.             public StackX() // constructor
  63.             {
  64.                 st = new int[SIZE];
  65.                 top = -1;
  66.             }
  67.             public virtual void push(int j)
  68.             {
  69.                 st[++top] = j;
  70.             }
  71.             public virtual int pop()
  72.             {
  73.                 return st[top--];
  74.             }
  75.             public virtual int peek()
  76.             {
  77.                 return st[top];
  78.             }
  79.             public virtual bool Empty
  80.             {
  81.                 get
  82.                 {
  83.                     return (top == -1);
  84.                 }
  85.             }
  86.         }
  87.  
  88.         public class Vertex
  89.         {
  90.             public char label; // label (e.g. 'A')
  91.             public bool wasAktiv;
  92.             // ------------------
  93.             public Vertex(char lab)
  94.             {
  95.                 label = lab;
  96.                 wasAktiv = false;
  97.             }
  98.             // ------------------
  99.         }
  100.  
  101.  
  102.         public class Graph
  103.         {
  104.             private readonly int MAX_VERTS = 20;
  105.             private Vertex[] vertexList; // list of vertices
  106.             private int[][] adjMat; // adjacency matrix
  107.             private int nVerts; // current number of vertices
  108.             private StackX theStack;
  109.             // ------------------
  110.             public Graph() // constructor
  111.             {
  112.                 vertexList = new Vertex[MAX_VERTS];
  113.               adjMat = RectangularArrays.ReturnRectangularIntArray(MAX_VERTS, MAX_VERTS);
  114.                 nVerts = 0;
  115.                 for (int j = 0; j < MAX_VERTS; j++) // set adjacency
  116.                 {
  117.                     for (int k = 0; k < MAX_VERTS; k++) // matrix to 0
  118.                     {
  119.                         adjMat[j][k] = 0;
  120.                     }
  121.                 }
  122.                 theStack = new StackX();
  123.             } // end constructor
  124.             // ------------------
  125.             public virtual void addVertex(char lab)
  126.             {
  127.                 vertexList[nVerts++] = new Vertex(lab);
  128.             }
  129.             // ------------------
  130.             public virtual void addEdge(int start, int end)
  131.             {
  132.                 adjMat[start][end] = 1;
  133.                 adjMat[end][start] = 1;
  134.             }
  135.             // ------------------
  136.             public virtual void displayVertex(int v)
  137.             {
  138.                 Console.Write(vertexList[v].label);
  139.             }
  140.             // ------------------
  141.             public virtual void dfs() // depth-first search
  142.             {
  143.                 vertexList[0].wasAktiv = true;
  144.                 displayVertex(0); // display it
  145.                 theStack.push(0); // push it
  146.                 while (!theStack.Empty) // until stack empty,
  147.                 {
  148.                    
  149.                     int v = getAdjUnvisitedVertex(theStack.peek());
  150.                     if (v == -1) // if no such vertex,
  151.                     {
  152.                         theStack.pop();
  153.                     }
  154.                     else
  155.                     {
  156.                         vertexList[v].wasAktiv = true; // mark it
  157.                         displayVertex(v); // display it
  158.                         theStack.push(v); // push it
  159.                     }
  160.                 } // end while
  161.                 // stack is empty, so we're done
  162.                 for (int j = 0; j < nVerts; j++) // reset flags
  163.                 {
  164.                     vertexList[j].wasAktiv = false;
  165.                 }
  166.             } // end dfs
  167.            
  168.             public virtual int getAdjUnvisitedVertex(int v)
  169.             {
  170.                 for (int j = 0; j < nVerts; j++)
  171.                 {
  172.                     if (adjMat[v][j] == 1 && vertexList[j].wasAktiv == false)
  173.                     {
  174.                         return j;
  175.                     }
  176.                 }
  177.                 return -1;
  178.             } // end getAdjUnvisitedVert()
  179.             // ------------------
  180.  
  181.         } // end class Graph
  182.         ////////////////////////////////////////////////////////////////
  183.  
  184.  
  185.  
  186.  
  187.         internal static partial class RectangularArrays
  188.         {
  189.             internal static int[][] ReturnRectangularIntArray(int Size1, int Size2)
  190.             {
  191.                 int[][] Array = new int[Size1][];
  192.                 for (int Array1 = 0; Array1 < Size1; Array1++)
  193.                 {
  194.                     Array[Array1] = new int[Size2];
  195.                 }
  196.                 return Array;
  197.             }
  198.         }
  199.  
  200.         public static void Main(string[] args)
  201.         {
  202.             Graph theGraph = new Graph();
  203.             theGraph.addVertex('1'); // 0 (start for dfs)
  204.             theGraph.addVertex('2'); // 1
  205.             theGraph.addVertex('3'); // 2
  206.             theGraph.addVertex('4'); // 3
  207.             theGraph.addVertex('5'); // 4
  208.             theGraph.addEdge(0, 1); // 1-2
  209.             theGraph.addEdge(1, 4); // 2-5
  210.             theGraph.addEdge(4, 2); // 5-3
  211.             theGraph.addEdge(2, 3); // 3-4
  212.             Console.Write("Visits: ");
  213.             theGraph.dfs(); // depth-first search
  214.             Console.WriteLine();
  215.             Console.ReadKey();
  216.         } // end main()
  217.  
  218.     }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement