mafulechka
29 липня 2019 р. 12:57

Алгоритм Prima

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


Як працює алгоритм Пріма

Він підпадає під клас алгоритмів, які називаються «жадібними» алгоритмами, які знаходять локальний оптимум, сподіваючись знайти глобальний оптимум.

Ми починаємо з однієї вершини і продовжуємо додавати ребра з найменшою вагою, доки не досягнемо нашої мети.

Кроки для реалізації алгоритму Прима наступні:

  1. Ініціалізуйте мінімальне остовне дерево з довільно обраною вершиною.
  2. Знайдіть усі ребра, які з'єднують дерево з новими вершинами, знайдіть мінімум і додайте його до дерева.
  3. Продовжуйте повторювати крок 2, доки не отримаєте мінімальне остовне дерево.

Приклад алгоритму Prima

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

Псевдокод для алгоритму Прима показує, як ми створюємо два набори вершин U та VU. U містить список вершин, що були відвідані, а VU – список вершин, що не були відвідані. Один за одним ми переміщуємо вершини з набору VU до набору 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 графа. Замість того, щоб починати з вершини, алгоритм Краскала сортує всі ребра від малої ваги до більшої і продовжує додавати нижні ребра, ігноруючи ті ребра, які створюють цикл.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up