mafulechka
mafulechka29. Juli 2019 02:57

Algorithmus Prima

Der Algorithmus von Prim ist ein Minimum-Spanning-Tree-Algorithmus, der einen Graphen als Eingabe nimmt und eine Teilmenge der Kanten dieses Graphen findet, die einen Baum bildet, der jeden Scheitelpunkt enthält und auch die minimale Summe von Gewichten unter allen Bäumen hat, die aus dem Graphen gebildet werden können .


So funktioniert der Algorithmus von Prim

Es fällt unter eine Klasse von Algorithmen, die als "greedy" Algorithmen* bezeichnet werden und ein lokales Optimum in der Hoffnung finden, ein globales Optimum zu finden.

Wir beginnen an einem Scheitelpunkt und fügen Kanten mit dem niedrigsten Gewicht hinzu, bis wir unser Ziel erreichen.

Die Schritte zur Implementierung von Prims Algorithmus sind wie folgt:

  1. Initialisiere einen minimalen Spannbaum mit einem beliebigen Scheitelpunkt.
  2. Finde alle Kanten, die den Baum mit neuen Knoten verbinden, finde das Minimum und füge es dem Baum hinzu.
  3. Wiederholen Sie Schritt 2 so lange, bis Sie den minimalen Spannbaum erhalten.

Prima-Algorithmus-Beispiel

Algorithmus von ##Prim. Pseudocode.

Der Pseudocode für den Algorithmus von Prim zeigt, wie wir zwei Sätze von Scheitelpunkten U und VU erzeugen. U enthält eine Liste von besuchten Scheitelpunkten und VU eine Liste von nicht besuchten Scheitelpunkten. Wir verschieben einen Knoten nach dem anderen von der Menge VU zur Menge U und verbinden dabei die Kante mit dem niedrigsten Gewicht.

Implementierung des Algorithmus von Prim in C++

Das folgende Programm implementiert den Algorithmus von Prim in C++. Obwohl er eine Adjazenzmatrix verwendet, um den Graphen darzustellen, kann dieser Algorithmus auch unter Verwendung einer Adjazenzliste implementiert werden, um seine Effizienz zu verbessern.

#include <iostream>
#include <cstring>
using namespace std;

#define INF 9999999

// number of vertices in grapj
#define V 5

// create a 2d array of size 5x5
//for adjacency matrix to represent graph

int G[V][V] = {
  {0, 9, 75, 0, 0},
  {9, 0, 95, 19, 42},
  {75, 95, 0, 51, 66},
  {0, 19, 51, 0, 31},
  {0, 42, 66, 31, 0}
};

int main () {

  int no_edge;            // number of edge

  // create a array to track selected vertex
  // selected will become true otherwise false
  int selected[V];

 // set selected false initially
  memset (selected, false, sizeof (selected));

 // set number of edge to 0
  no_edge = 0;

  // the number of egde in minimum spanning tree will be
  // always less than (V -1), where V is number of vertices in
  //graph

  // choose 0th vertex and make it true
  selected[0] = true;

  int x;            //  row number
  int y;            //  col number

  // print for edge and weight
  cout << "Edge" << " : " << "Weight";
  cout << endl;
  while (no_edge < V - 1) {

  //For every vertex in the set S, find the all adjacent vertices
  // , calculate the distance from the vertex selected at step 1.
  // if the vertex is already in the set S, discard it otherwise
  //choose another vertex nearest to selected vertex  at step 1.

      int min = INF;
      x = 0;
      y = 0;

      for (int i = 0; i < V; i++) {
        if (selected[i]) {
            for (int j = 0; j < V; j++) {
              if (!selected[j] && G[i][j]) { // not in selected and there is an edge
                  if (min > G[i][j]) {
                      min = G[i][j];
                      x = i;
                      y = j;
                  }

              }
          }
        }
      }
      cout << x <<  " - " << y << " :  " << G[x][y];
      cout << endl;
      selected[y] = true;
      no_edge++;
    }

  return 0;
}

Wenn wir den obigen Code ausführen, erhalten wir folgende Ausgabe:

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

Prims Algorithmus vs. Kraskals

Kruskals Algorithmus ist ein weiterer beliebter Minimum-Spanning-Tree-Algorithmus, der eine andere Logik verwendet, um den MST-Graphen zu finden. Anstatt oben zu beginnen, sortiert Kruskals Algorithmus alle Kanten von niedrigem Gewicht zu hohem Gewicht und fährt fort, die niedrigsten Kanten hinzuzufügen, wobei diejenigen Kanten ignoriert werden, die einen Zyklus erzeugen.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken