Logo Minimale Spannbäume in Graphen: der Algorithmus von Prim Technische Universität München
MST example.

Minimaler Spannbaum (MST) in grün!

Der Minimale Spannbaum-Algorithmus

Eine Telekommunikationsfirma möchte alle Häuser einer neuen Nachbarschaft ans Internet anbinden. Die einfachste Möglichkeit zur Installation der Kabelverbindungen ist, sie entlang von Straßen zu vergraben. Deshalb beschließt die Firma, die Anschlüsse an Straßenkreuzungen zu nutzen. Wie können die Kosten hierfür minimiert werden, wenn der Preis für die Verbindung von zwei Anschlüssen der Länge des sie verbindenden Kabels entspricht?

Wenn man die Straßen als einen Graphen betrachtet, ist das obige Beispiel eine Instanz des Minimalen Spannbaum Problems. Die Algorithmen von Prim and Kruskal sind zwei bekannte Verfahren, welche eine alle Knoten verbindende Teilmenge von Kanten minimalen Gewichts eines gewichteten ungerichteten Graphen berechnen können.

Diese Seite präsentiert den Algorithmus von Prim, welcher den minimalen Spannbaum (MST) eines gewichteten zusammenhängenden Graphen berechnet. Zum Vergleich findest du hier auch ein Einführung zum Algorithmus von Kruskal.

Was möchtest du zuerst tun?

SVG Download

Legende

Node Knoten
Edge Kante mit Gewicht 50

Legende

Auf welchem Graph soll der Algorithmus ausgeführt werden?

Nimm ein fertiges Beispiel!

Ändere den Graphen nach deinen Vorstellungen:

  • Um einen Knoten zu erstellen, mache einen Doppelklick in das Zeichenfeld.
  • Um eine Kante zu erstellen, klicke zunächst auf den Ausgangsknoten und dann auf den Zielknoten.
  • Das Kantengewicht kann mit einem Doppelklick auf die Kante verändert werden.
  • Ein Rechtsklick löscht Kanten und Knoten.

Lade den veränderten Graphen herunter:

Download

Lade einen existierenden Graphen hoch:

Ein

trat auf beim Lesen der Datei:

Fehlerbeschreibung:

                    

Was nun?

SVG Download

Legende

Root node Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird
Current node Gerade bearbeiteter Knoten
Node in the queue Knoten in der Warteschlange
Edge Kante im minimalen Spannbaum

Legende

Status des Algorithmus

BEGIN

T ← ∅

FOR i ← 1, ..., n DO

d(v[i]) ← ∞, parent(v[i]) ← NULL

d(v[1]) ← 0, parent(v[1]) ← v[1]

WHILE queue ≠ ∅ DO

u ← queue.extractMin()

IF parent(u) ≠ u

T.add({parent(u), u})

FOR ALL {u, w} ∈ E do

IF w ∈ queue AND l(u, w) < d(w) THEN

d(w) ← l(u, w), parent(w) ← u

ELSE IF parent(w) = NULL THEN

d(w) ← l(u, w), parent(w) ← u

queue.insert(w)

END

Warteschlange:

Your browser does not support HTML5 Canvas. Please use a modern browser, i.e.Mozilla Firefox

Beim Wechsel des Tabs wird der Algorithmus abgebrochen.

Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.

SVG Download

Legende

Root node Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird
Node in the queue Aus der Warteschlange entfernter Knoten

Legende

In welcher Reihenfolge werden die Knoten aus der Warteschlange entnommen?

In welcher Reihenfolge werden die Knoten aus der Warteschlange entnommen?

Deine Aufgabe ist es, in der Reihenfolge, in welcher die Knoten aus der Warteschlange entfernt werden, auf die Knoten zu klicken.
Dies entspricht der Reihenfolge, in welcher die Knoten während der Ausführung des Algorithmus rot markiert werden.

Bei Wechsel des Tabs wird die Aufgabe beendet.

Du kannst ein weiteres Browserfenster öffnen, um gleichzeitig die Beschreibung zu lesen.

SVG Download

Legende

Start Knoten Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird
Aktueller Knoten Gerade bearbeiteter Knoten
Knoten in Warteschlange Knoten in der Warteschlange
Knoten Kante im minimalen Spannbaum

Legende

Überprüfe dein Wissen: Wie würde der Algorithmus entscheiden?

BEGIN

T ← ∅

FOR i ← 1, ..., n DO

d(v[i]) ← ∞, parent(v[i]) ← NULL

d(v[1]) ← 0, parent(v[1]) ← v[1]

WHILE queue ≠ ∅ DO

u ← queue.extractMin()

IF parent(u) ≠ u

T.add({parent(u), u})

FOR ALL {u, w} ∈ E do

IF w ∈ queue AND l(u, w) < d(w) THEN

d(w) ← l(u, w), parent(w) ← u

ELSE IF parent(w) = NULL THEN

d(w) ← l(u, w), parent(w) ← u

queue.insert(w)

END

Beim Wechsel des Tabs wird der Algorithmus abgebrochen.

Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.