Minimaler Spannbaum (MST) in grün!
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.
Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird | |
Gerade bearbeiteter Knoten | |
Knoten in der Warteschlange | |
Kante im minimalen Spannbaum |
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
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.
Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird | |
Aus der Warteschlange entfernter Knoten |
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.
Du kannst ein weiteres Browserfenster öffnen, um gleichzeitig die Beschreibung zu lesen.
Wurzel, ein beliebiger Knoten welcher als Wurzel des MST genutzt wird | |
Gerade bearbeiteter Knoten | |
Knoten in der Warteschlange | |
Kante im minimalen Spannbaum |
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
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.