Advertisement
Infiniti_Inter

22 - II

Mar 11th, 2020
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.66 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. public class Stack
  8. {
  9.     private class Node //вложенный класс, реализующий элемент стека
  10.     {
  11.         private object inf;
  12.         private Node next;
  13.         public Node(object nodeInfo)
  14.         {
  15.             inf = nodeInfo;
  16.             next = null;
  17.         }
  18.         public Node Next
  19.         {
  20.             get { return next; }
  21.             set { next = value; }
  22.         }
  23.         public object Inf
  24.         {
  25.             get { return inf; }
  26.             set { inf = value; }
  27.         }
  28.     } //конец класса Node
  29.     private Node head; //ссылка на вершину стека
  30.     public Stack() //конструктор класса, создает пустой стек
  31.     {
  32.         head = null;
  33.     }
  34.     public void Push(object nodeInfo) // добавляет элемент в вершину стека
  35.     {
  36.         Node r = new Node(nodeInfo);
  37.         r.Next = head;
  38.         head = r;
  39.     }
  40.     public object Pop() //извлекает элемент из вершины стека, если он не пуст
  41.     {
  42.         if (head == null)
  43.         {
  44.             throw new Exception("Стек пуст");
  45.         }
  46.         else
  47.         {
  48.             Node r = head;
  49.             head = r.Next;
  50.             return r.Inf;
  51.         }
  52.     }
  53.     public bool IsEmpty //определяет пуст или нет стек
  54.     {
  55.         get
  56.         {
  57.             if (head == null)
  58.             {
  59.                 return true;
  60.             }
  61.             else
  62.             {
  63.                 return false;
  64.             }
  65.         }
  66.     }
  67. }
  68.  
  69. public class Graph
  70. {
  71.     private class Node //вложенный класс для скрытия данных и алгоритмов
  72.     {
  73.         private int[,] array; //матрица смежности
  74.         public int this[int i, int j] //индексатор для обращения к матрице смежности
  75.         {
  76.             get
  77.             {
  78.                 return array[i, j];
  79.             }
  80.             set
  81.             {
  82.                 array[i, j] = value;
  83.             }
  84.         }
  85.         public bool this[int i] //индексатор для обращения к матрице меток
  86.         {
  87.             get
  88.             {
  89.                 return nov[i];
  90.             }
  91.             set
  92.             {
  93.                 nov[i] = value;
  94.             }
  95.         }
  96.         public int Size //свойство для получения размерности матрицы смежности
  97.         {
  98.             get
  99.             {
  100.                 return array.GetLength(0);
  101.             }
  102.         }
  103.         private bool[] nov; //вспомогательный массив: если i-ый элемент массива равен
  104.                             //true, то i-ая вершина еще не просмотрена; если i-ый
  105.                             //элемент равен false, то i-ая вершина просмотрена
  106.         public void NovSet() //метод помечает все вершины графа как непросмотреные
  107.         {
  108.             for (int i = 0; i < Size; i++)
  109.             {
  110.                 nov[i] = true;
  111.             }
  112.         }
  113.         //конструктор вложенного класса, инициализирует матрицу смежности и
  114.         // вспомогательный массив
  115.         public Node(int[,] a)
  116.         {
  117.             array = a;
  118.             nov = new bool[a.GetLength(0)];
  119.         }
  120.         //реализация алгоритма обхода графа в глубину
  121.         public void Dfs(int v)
  122.         {
  123.             Console.Write("{0} ", v); //просматриваем текущую вершину
  124.             nov[v] = false; //помечаем ее как просмотренную
  125.                             // в матрице смежности просматриваем строку с номером v
  126.             for (int u = 0; u < Size; u++)
  127.             {
  128.                 //если вершины v и u смежные, к тому же вершина u не просмотрена,
  129.                 if (array[v, u] != 0 && nov[u])
  130.                 {
  131.                     Dfs(u); // то рекурсивно просматриваем вершину
  132.                 }
  133.             }
  134.         }
  135.         //реализация алгоритма обхода графа в ширину
  136.         public void Bfs(int v)
  137.         {
  138.             Queue<int> q = new Queue<int>();
  139.             q.Enqueue(v); //помещаем вершину v в очередь
  140.             nov[v] = false; // помечаем вершину v как просмотренную
  141.             while (q.Count != 0) // пока очередь не пуста
  142.             {
  143.                 v = Convert.ToInt32(q.Dequeue()); //извлекаем вершину из очереди
  144.                 Console.Write("{0} ", v); //просматриваем ее
  145.                 for (int u = 0; u < Size; u++) //находим все вершины
  146.                 {
  147.                     if (array[v, u] != 0 && nov[u]) // смежные с данной и еще не просмотренные
  148.                     {
  149.                         q.Enqueue(u); //помещаем их в очередь
  150.                         nov[u] = false; //и помечаем как просмотренные
  151.                     }
  152.                 }
  153.             }
  154.         }
  155.  
  156.  
  157.  
  158.  
  159.         public void SearchGm(int k, ref int[] St, ref bool fl)
  160.         {
  161.             int v = St[k - 1];
  162.             if (!fl)
  163.                 return;
  164.             for (int j = 0; j < array.GetLength(0); j++)
  165.             {
  166.                 if (array[v, j] != 0)
  167.                 {
  168.                     if (k == array.GetLength(0))
  169.                     {
  170.                         St[k] = j;
  171.                         foreach (int item in St)
  172.                         {
  173.                             Console.Write("{0} ", item + 1);
  174.                         }
  175.                         Console.WriteLine();
  176.                         fl = false;
  177.                         return;
  178.                        
  179.                     }
  180.                     else
  181.                     {
  182.                         if (nov[j])
  183.                         {
  184.                             St[k] = j;
  185.                             nov[j] = false;
  186.                             SearchGm(k + 1, ref St, ref fl);
  187.                             nov[j] = true;
  188.                         }
  189.                     }
  190.  
  191.                 }
  192.  
  193.             }
  194.  
  195.         }
  196.  
  197.     } //конец вложенного клаcса
  198.     private Node graph; //закрытое поле, реализующее АТД «граф»
  199.     public Graph(string name) //конструктор внешнего класса
  200.     {
  201.         using (StreamReader file = new StreamReader($"D:/{name}"))
  202.         {
  203.             int n = int.Parse(file.ReadLine());
  204.             int[,] a = new int[n, n];
  205.             for (int i = 0; i < n; i++)
  206.             {
  207.                 string line = file.ReadLine();
  208.                 string[] mas = line.Split(' ');
  209.                 for (int j = 0; j < n; j++)
  210.                 {
  211.                     a[i, j] = int.Parse(mas[j]);
  212.                 }
  213.             }
  214.             graph = new Node(a);
  215.         }
  216.     }
  217.     //метод выводит матрицу смежности на консольное окно
  218.     public void Show()
  219.     {
  220.         for (int i = 0; i < graph.Size; i++)
  221.         {
  222.             for (int j = 0; j < graph.Size; j++)
  223.             {
  224.                 Console.Write("{0,4}", graph[i, j]);
  225.             }
  226.             Console.WriteLine();
  227.         }
  228.     }
  229.     public void Dfs(int v)
  230.     {
  231.         graph.NovSet();
  232.         graph.Dfs(v);
  233.         Console.WriteLine();
  234.     }
  235.     public void Bfs(int v)
  236.     {
  237.         graph.NovSet();
  238.         graph.Bfs(v);
  239.         Console.WriteLine();
  240.     }
  241.  
  242.  
  243.     public void SearchGm(int start)//внешний класс Гамильтонов
  244.     {
  245.         graph.NovSet();
  246.         int[] St = new int[graph.Size + 1];
  247.         St[0] = 0;
  248.         graph[0] = false; //обращение к индексатору
  249.         //int start = int.Parse(Console.ReadLine());
  250.         bool fl = true;
  251.         graph.SearchGm(start, ref St, ref fl);
  252.     }
  253.  
  254.     public int GetLength()
  255.     {
  256.         return graph.Size;
  257.     }
  258. }
  259. class Program
  260. {
  261.     static void Main(string[] args)
  262.     {
  263.  
  264.         Graph gr = new Graph("input.txt");
  265.         gr.SearchGm(1);
  266.     }
  267.  
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement