Главная страница
Навигация по странице:

  • Определение двудольного графа.

  • Определение паросочетания и максимального паросочетания.

  • Наибольшим (или максимальным) паросочетанием

  • Кузьмина Про-228_РГР. Алгоритмы и структуры данных


    Скачать 458.72 Kb.
    НазваниеАлгоритмы и структуры данных
    Дата28.04.2022
    Размер458.72 Kb.
    Формат файлаdocx
    Имя файлаКузьмина Про-228_РГР.docx
    ТипПояснительная записка
    #502405

    Министерство науки и высшего образования Российской Федерации

    Федеральное государственное бюджетное

    образовательное учреждение высшего образования

    «Уфимский государственный авиационный технический университет»

    Факультет информатики и робототехники
    Кафедра вычислительной математики и кибернетики

    Пояснительная записка к расчетно-графической работе

    по дисциплине «Алгоритмы и структуры данных»
    Выполнил:

    Студент группы ПРО-228 Кузьмина Е.В.

    Проверил:

    Канд.техн.наук Верхотурова Г.Н.


    Уфа – 2021

    Y

    1Постановка задачи 4

    1.1.Определение 4

    1.1.Входные данные 5

    1.2.Промежуточные данные 5

    1.3.Описание алгоритма 5

    1.4.Код 6

    2Примеры работы программы 9

    3Список литературы 10

    СОДЕРЖАНИЕ

    Y1 Постановка зада

    1.1. Определение 3

    1.2. Входные данные 4

    1.3. Промежуточные данные 4

    1.4. Описание алгоритма 4

    1.5. Код 5

    2 Примеры работы программы 8

    3 Список литературы 9

    1Постановка задачи 4

    1.1.Определение 4

    1.1.Входные данные 5

    1.2.Промежуточные данные 5

    1.3.Описание алгоритма 5

    1.4.Код 6

    2Примеры работы программы 9

    3Список литературы 10
    1. Постановка задачи


    Написать программу нахождения максимального паросочетания для двудольного графа. Разработать алгоритм решения этой задачи и написать программу.
      1. Определение


    Определение двудольного графа.

    Двудольный граф - граф, вершины которого можно разбить на два множества так, что каждое ребро соединяет вершины из разных множеств.

    Определение паросочетания и максимального паросочетания.

    Паросочетанием M называется набор попарно несмежных рёбер графа (иными словами, любой вершине графа должно быть инцидентно не более одного ребра из множества M). Мощностью паросочетания назовём количество рёбер в нём.

    Наибольшим (или максимальным) паросочетанием назовём паросочетание, мощность которого максимальна среди всех возможных паросочетаний в данном графе.

    Описание алгоритма

    Алгоритм просматривает все вершины v графа: v = 1 … n. Если текущая вершина v уже насыщена текущим паросочетанием (т.е. уже выбрано какое-то смежное ей ребро), то эту вершину пропускаем. Иначе — алгоритм пытается насытить эту вершину, для чего запускается поиск увеличивающей цепи, начинающейся с этой вершины.

    Поиск увеличивающей цепи осуществляется с помощью специального обхода в глубину.

      1. Входные данные


    • nodes - вершины в графе

    • connections – ребра графа
      1. Промежуточные данные


    • checkedNodes – просмотренные вершины

    • node – просматриваемая на данный момент вершина

    Выходные данные:

    • parArray – найденные паросочетания

    • lblAnswer – (элемент Label) поле, в которое выводится найденное максимальное паросочетание
      1. Описание алгоритма




    В функции FindMaxPar проверяются вершины на просмотренность. Если вершина еще не просмотрена, она просматривается с помощью обхода в глубину. В функции DFS находится такая вершина, которая связана с этой вершиной и при этом еще не просмотрена в функции выше. Найденная вершина отмечается как просмотренная, в массиве parArray отмечается данное паросочетание.
      1. Код


    1. using System;

    2. using System.Collections.Generic;

    3. using System.ComponentModel;

    4. using System.Data;

    5. using System.Drawing;

    6. using System.Linq;

    7. using System.Text;

    8. using System.Threading.Tasks;

    9. using System.Windows.Forms;



    10. namespace RGRAlg

    11. {

    12. public partial class Form1 : Form

    13. {

    14. List nodes = new List();



    15. const int MAXNODES = 25;

    16. int[,] connections = new int[MAXNODES, MAXNODES];

    17. int[] checkedNodes = new int[MAXNODES];

    18. int[,] parArray = new int[MAXNODES, MAXNODES];



    19. bool isReadyForCreateNodes = false;

    20. int numbersOfNode = 0;

    21. int nodeWidth = 30;

    22. int nodeHeight = 30;



    23. public Form1()

    24. {

    25. InitializeComponent();

    26. }



    27. private void btnCreateNodes_Click(object sender, EventArgs e)

    28. {

    29. isReadyForCreateNodes = true;

    30. }



    31. private void btnStopCreateNodes_Click(object sender, EventArgs e)

    32. {

    33. isReadyForCreateNodes = false;

    34. }



    35. private void Form1_MouseDown(object sender, MouseEventArgs e)

    36. {

    37. if (isReadyForCreateNodes)

    38. {

    39. DrawEllipse(e.X, e.Y);

    40. numbersOfNode++;

    41. DrawString(numbersOfNode, e.X, e.Y);

    42. }

    43. }

    44. private void DrawEllipse(int x, int y)

    45. {

    46. System.Drawing.Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Black);

    47. System.Drawing.Graphics formGraphics;

    48. formGraphics = this.CreateGraphics();

    49. Rectangle ellipse = new Rectangle(x - nodeWidth / 2, y - nodeHeight / 2, nodeWidth, nodeHeight);

    50. formGraphics.DrawEllipse(myPen, ellipse);

    51. nodes.Add(ellipse);

    52. myPen.Dispose();

    53. formGraphics.Dispose();

    54. }

    55. public void DrawString(int numberOfNode, int xNode, int yNode)

    56. {

    57. System.Drawing.Graphics formGraphics = this.CreateGraphics();

    58. string drawString = numberOfNode.ToString();

    59. System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 14);

    60. System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);

    61. System.Drawing.StringFormat drawFormat = new System.Drawing.StringFormat();

    62. formGraphics.DrawString(drawString, drawFont, drawBrush, xNode - nodeWidth / 2, yNode - nodeHeight / 2, drawFormat);

    63. drawFont.Dispose();

    64. drawBrush.Dispose();

    65. formGraphics.Dispose();

    66. }



    67. private void btnCreateConnect_Click(object sender, EventArgs e)

    68. {

    69. DrawConnection(nodes[(int)numFirstNode.Value - 1].X + nodeWidth / 2, nodes[(int)numFirstNode.Value - 1].Y + nodeHeight / 2, nodes[(int)numSecondNode.Value - 1].X + nodeWidth / 2, nodes[(int)numSecondNode.Value - 1].Y + nodeHeight / 2);

    70. connections[(int)numFirstNode.Value - 1, (int)numSecondNode.Value - 1] = 1;

    71. connections[(int)numSecondNode.Value - 1, (int)numFirstNode.Value - 1] = 1;

    72. }

    73. public void DrawConnection(int x1, int y1, int x2, int y2)

    74. {

    75. Pen pen = new Pen(System.Drawing.Color.Black);

    76. System.Drawing.Graphics formGraphics;

    77. formGraphics = this.CreateGraphics();

    78. formGraphics.DrawLine(pen, x1, y1, x2, y2);

    79. pen.Dispose();

    80. formGraphics.Dispose();

    81. }



    82. void FindMaxPar()

    83. {

    84. for (int i = 0; i < nodes.Count; i++)

    85. {

    86. if(checkedNodes[i] == 1)

    87. {

    88. continue;

    89. }

    90. else

    91. {

    92. checkedNodes[i] = 1;

    93. DFS(i);

    94. }

    95. }

    96. }



    97. void DFS(int node)

    98. {

    99. for (int j = 0; j < nodes.Count; j++)

    100. {

    101. if (connections[node, j] == 1 && checkedNodes[j] == 0)

    102. {

    103. checkedNodes[j] = 1;

    104. parArray[node, j] = 1;

    105. break;

    106. }

    107. }

    108. }



    109. private void btnMaxPar_Click(object sender, EventArgs e)

    110. {

    111. lblAnswer.Text = "";

    112. for (int i = 0; i < nodes.Count; i++)

    113. {

    114. for (int j = 0; j < nodes.Count; j++)

    115. {

    116. parArray[i, j] = 0;

    117. }

    118. checkedNodes[i] = 0;

    119. }



    120. FindMaxPar();



    121. for (int i = 0; i < nodes.Count; i++)

    122. {

    123. for (int j = 0; j < nodes.Count; j++)

    124. {

    125. if (parArray[i, j] != 0)

    126. {

    127. lblAnswer.Text += (i + 1) + " и " + (j + 1) + " ";

    128. }

    129. }

    130. }

    131. }

    132. }

    133. }


    Оценка сложности: Алгоритм можно представить, как серию из n запусков обхода в глубину на всём графе. Следовательно, всего этот алгоритм исполняется за время O (n m), что в худшем случае есть O (n^2).


    1. Примеры работы программы










    1. Список литературы


    • Metanit.com — сайт о программировании [Электронный ресурс]. URL: https://metanit.com/sharp/adonet/3.5.php

    • Stack Overflow — сайт вопросов и ответов для программистов [Электронный ресурс]. URL: https://ru.stackoverflow.com

    • CyberForum.ru — веб-форум для IT-специалистов [Электронный ресурс]. URL: https://www.cyberforum.ru


    написать администратору сайта