mafulechka
29 июля 2019 г. 12:57

Алгоритм Прима

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


Как работает алгоритм Прима

Он подпадает под класс алгоритмов, называемых «жадными» алгоритмами , которые находят локальный оптимум в надежде найти глобальный оптимум.

Мы начинаем с одной вершины и продолжаем добавлять ребра с наименьшим весом, пока не достигнем нашей цели.

Шаги для реализации алгоритма Прима следующие:

  1. Инициализируйте минимальное остовное дерево с произвольно выбранной вершиной.
  2. Найдите все ребра, которые соединяют дерево с новыми вершинами, найдите минимум и добавьте его в дерево.
  3. Продолжайте повторять шаг 2, пока не получите минимальное остовное дерево.

Пример алгоритма Прима

Алгоритм Прима. Псевдокод.

Псевдокод для алгоритма Прима показывает, как мы создаем два набора вершин U и V-U. U содержит список вершин, которые были посещены, а V-U – список вершин, которые не были посещены. Один за другим мы перемещаем вершины из набора V-U в набор U, соединяя ребро с наименьшим весом.

Реализация алгоритма Прима в C ++

Программа ниже реализует алгоритм Прима в C ++. Несмотря на то, что используется матрица смежности для представления графа, этот алгоритм также может быть реализован с использованием списка смежности для повышения его эффективности.

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. #define INF 9999999
  6.  
  7. // number of vertices in grapj
  8. #define V 5
  9.  
  10. // create a 2d array of size 5x5
  11. //for adjacency matrix to represent graph
  12.  
  13. int G[V][V] = {
  14. {0, 9, 75, 0, 0},
  15. {9, 0, 95, 19, 42},
  16. {75, 95, 0, 51, 66},
  17. {0, 19, 51, 0, 31},
  18. {0, 42, 66, 31, 0}
  19. };
  20.  
  21. int main () {
  22.  
  23. int no_edge; // number of edge
  24.  
  25. // create a array to track selected vertex
  26. // selected will become true otherwise false
  27. int selected[V];
  28.  
  29. // set selected false initially
  30. memset (selected, false, sizeof (selected));
  31.  
  32. // set number of edge to 0
  33. no_edge = 0;
  34.  
  35. // the number of egde in minimum spanning tree will be
  36. // always less than (V -1), where V is number of vertices in
  37. //graph
  38.  
  39. // choose 0th vertex and make it true
  40. selected[0] = true;
  41.  
  42. int x; // row number
  43. int y; // col number
  44.  
  45. // print for edge and weight
  46. cout << "Edge" << " : " << "Weight";
  47. cout << endl;
  48. while (no_edge < V - 1) {
  49.  
  50. //For every vertex in the set S, find the all adjacent vertices
  51. // , calculate the distance from the vertex selected at step 1.
  52. // if the vertex is already in the set S, discard it otherwise
  53. //choose another vertex nearest to selected vertex at step 1.
  54.  
  55. int min = INF;
  56. x = 0;
  57. y = 0;
  58.  
  59. for (int i = 0; i < V; i++) {
  60. if (selected[i]) {
  61. for (int j = 0; j < V; j++) {
  62. if (!selected[j] && G[i][j]) { // not in selected and there is an edge
  63. if (min > G[i][j]) {
  64. min = G[i][j];
  65. x = i;
  66. y = j;
  67. }
  68.  
  69. }
  70. }
  71. }
  72. }
  73. cout << x << " - " << y << " : " << G[x][y];
  74. cout << endl;
  75. selected[y] = true;
  76. no_edge++;
  77. }
  78.  
  79. return 0;
  80. }

Запустив приведенный выше код, мы получим вывод в виде:

  1. Edge : Weight
  2. 0 - 1 : 9
  3. 1 - 3 : 19
  4. 3 - 4 : 31
  5. 3 - 2 : 51

Алгоритм Прима vs Краскала

Алгоритм Краскала является еще одним популярным алгоритмом минимального оставного дерева, который использует другую логику для нахождения MST графа. Вместо того, чтобы начинать с вершины, алгоритм Краскала сортирует все ребра от малого веса к большему и продолжает добавлять самые нижние ребра, игнорируя те ребра, которые создают цикл.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь