Добавить в граф ребро, соединяющее вершину а и b для взвешенного графа - C#

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

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

В входном файле указывается количество вершин графа/орграфа и матрица смежности.

Решение задачи: «Добавить в граф ребро, соединяющее вершину а и b для взвешенного графа»

textual
Листинг программы
  1. public class Graph
  2.     {
  3.  
  4.         public class Queue
  5.         {
  6.             private class Node //вложенный класс, реализующий базовый элемент очереди
  7.             {
  8.                 private object inf;
  9.                 private Node next;
  10.                 public Node(object nodeInfo)
  11.                 {
  12.                     inf = nodeInfo;
  13.                     next = null;
  14.                 }
  15.                 public Node Next
  16.                 {
  17.                     get { return next; }
  18.                     set { next = value; }
  19.                 }
  20.                 public object Inf
  21.                 {
  22.                     get { return inf; }
  23.                     set { inf = value; }
  24.                 }
  25.             } //конец класса Node
  26.             private Node head;
  27.             private Node tail;
  28.             public Queue()
  29.             {
  30.                 head = null;
  31.                 tail = null;
  32.             }
  33.             public void Add(object nodeInfo)
  34.             {
  35.                 Node r = new Node(nodeInfo);
  36.                 if (head == null)
  37.                 {
  38.                     head = r;
  39.                     tail = r;
  40.                 }
  41.                 else
  42.                 {
  43.                     tail.Next = r;
  44.                     tail = r;
  45.                 }
  46.             }
  47.             public object Take()
  48.             {
  49.                 if (head == null)
  50.                 {
  51.                     throw new Exception("Очередь пуста.");
  52.                 }
  53.                 else
  54.                 {
  55.                     Node r = head;
  56.                     head = head.Next;
  57.  
  58.                     if (head == null)
  59.                     {
  60.                         tail = null;
  61.                     }
  62.                     return r.Inf;
  63.                 }
  64.             }
  65.             public bool IsEmpty
  66.             {
  67.                 get
  68.                 {
  69.                     if (head == null)
  70.                     {
  71.                         return true;
  72.                     }
  73.                     else
  74.                     {
  75.                         return false;
  76.                     }
  77.                 }
  78.             }
  79.  
  80.         }
  81.         private class Node //вложенный класс для скрытия данных и алгоритмов
  82.         {
  83.             private int[,] array; //матрица смежности
  84.             public int this[int i, int j] //индексатор для обращения к матрице смежности
  85.             {
  86.                 get
  87.                 {
  88.                     return array[i, j];
  89.                 }
  90.                 set
  91.                 {
  92.                     array[i, j] = value;
  93.                 }
  94.             }
  95.             public int Size //свойство для получения размерности матрицы смежности
  96.             {
  97.                 get
  98.                 {
  99.                     return array.GetLength(0);
  100.                 }
  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.  
  122.             public void Dfs(int v)
  123.             {
  124.                 Console.Write("{0} ", v); //просматриваем текущую вершину
  125.                 nov[v] = false; //помечаем ее как просмотренную
  126.                 // в матрице смежности просматриваем строку с номером v
  127.                 for (int u = 0; u < Size; u++)
  128.                 {
  129.                     //если вершины v и u смежные, к тому же вершина u не просмотрена,
  130.                     if (array[v, u] != 0 && nov[u])
  131.                     {
  132.                         Dfs(u); // то рекурсивно просматриваем вершину
  133.                     }
  134.                 }
  135.             }
  136.  
  137.             //реализация алгоритма Флойда
  138.             public long[,] Floyd(out int[,] p)
  139.             {
  140.                 int i, j, k;
  141.                 //создаем массивы р и а
  142.                 long[,] a = new long[Size, Size];
  143.                 p = new int[Size, Size];
  144.                 for (i = 0; i < Size; i++)
  145.                 {
  146.                     for (j = 0; j < Size; j++)
  147.                     {
  148.                         if (i == j)
  149.                         {
  150.                             a[i, j] = 0;
  151.                         }
  152.                         else
  153.                         {
  154.                             if (array[i, j] == 0)
  155.                             {
  156.                                 a[i, j] = int.MaxValue;
  157.                             }
  158.                             else
  159.                             {
  160.                                 a[i, j] = array[i, j];
  161.                             }
  162.                         }
  163.                         p[i, j] = -1;
  164.                     }
  165.                 }
  166.                 //осуществляем поиск кратчайших путей
  167.                 for (k = 0; k < Size; k++)
  168.                 {
  169.                     for (i = 0; i < Size; i++)
  170.                     {
  171.                         for (j = 0; j < Size; j++)
  172.                         {
  173.                             long distance = a[i, k] + a[k, j];
  174.                             if (a[i, j] > distance)
  175.                             {
  176.                                 a[i, j] = distance;
  177.                                 p[i, j] = k;
  178.                             }
  179.                         }
  180.                     }
  181.                 }
  182.                 return a;//в качестве результата возвращаем массив кратчайших путей между
  183.             } //всеми парами вершин
  184.             //восстановление пути от вершины a до вершины в для алгоритма Флойда
  185.             public void WayFloyd(int a, int b, int[,] p, ref Queue items)
  186.             {
  187.                 int k = p[a, b];
  188.                 //если k<> -1, то путь состоит более чем из двух вершин а и b, и проходит через
  189.                 //вершину k, поэтому
  190.                 if (k != -1)
  191.                 {
  192.                     // рекурсивно восстанавливаем путь между вершинами а и k
  193.                     WayFloyd(a, k, p, ref items);
  194.                     items.Add(k); //помещаем вершину к в очередь
  195.                     // рекурсивно восстанавливаем путь между вершинами k и b
  196.                     WayFloyd(k, b, p, ref items);
  197.                 }
  198.             }
  199.         } //конец вложенного клаcса
  200.         private Node graph; //закрытое поле, реализующее АТД «граф»
  201.         public Graph(string name) //конструктор внешнего класса
  202.         {
  203.             using (StreamReader file = new StreamReader(name))
  204.             {
  205.                 int n = int.Parse(file.ReadLine());
  206.                 int[,] a = new int[n, n];
  207.                 for (int i = 0; i < n; i++)
  208.                 {
  209.                     string line = file.ReadLine();
  210.                     string[] mas = line.Split(' ');
  211.                     for (int j = 0; j < n; j++)
  212.                     {
  213.                         a[i, j] = int.Parse(mas[j]);
  214.                     }
  215.                 }
  216.                 graph = new Node(a);
  217.             }
  218.         }
  219.  
  220.         //метод выводит матрицу смежности на консольное окно
  221.         public void Show()
  222.         {
  223.             for (int i = 0; i < graph.Size; i++)
  224.             {
  225.                 for (int j = 0; j < graph.Size; j++)
  226.                 {
  227.                     Console.Write("{0,4}", graph[i, j]);
  228.                 }
  229.                 Console.WriteLine();
  230.             }
  231.         }
  232.         public void Dfs(int v)
  233.         {
  234.             graph.NovSet();//помечаем все вершины графа как непросмотренные
  235.             graph.Dfs(v); //запускаем алгоритм обхода графа в глубину
  236.             Console.WriteLine();
  237.         }
  238.  
  239.  
  240.         public void Floyd()
  241.         {
  242.             int[,] p;
  243.             long[,] a = graph.Floyd(out p); //запускаем алгоритм Флойда
  244.             int i, j;
  245.             //анализируем полученные данные и выводим их на экран
  246.             for (i = 0; i < graph.Size; i++)
  247.             {
  248.                 for (j = 0; j < graph.Size; j++)
  249.                 {
  250.                     if (i != j)
  251.                     {
  252.                         if (a[i, j] == int.MaxValue)
  253.                         {
  254.                             Console.WriteLine("Пути из вершины {0} в вершину {1} не существует", i, j);
  255.                         }
  256.                         else
  257.                         {
  258.                             Console.Write("Кратчайший путь от вершины {0} до вершины {1} равен {2}, ", i, j, a[i, j]);
  259.  
  260.                             Console.Write(" путь ");
  261.                             Queue items = new Queue();
  262.                             items.Add(i);
  263.                             graph.WayFloyd(i, j, p, ref items);
  264.                             items.Add(j);
  265.                             while (!items.IsEmpty)
  266.                             {
  267.                                 Console.Write("{0} ", items.Take());
  268.                             }
  269.                             Console.WriteLine();
  270.                         }
  271.                     }
  272.                 }
  273.             }
  274.         }
  275.      
  276.         static void Main()
  277.         {
  278.             Graph g = new Graph("input.txt");
  279.             Console.WriteLine("Graph:");
  280.             g.Show();
  281.            
  282.            
  283.         }
  284.     }

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


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

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

10   голосов , оценка 4.1 из 5

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

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

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