Graph hat zwei / drei verschiedene minimale Spannbäume?


15

Ich versuche eine effiziente Methode zu finden, um festzustellen, ob ein gegebener Graph G zwei verschiedene minimale Spannbäume hat. Ich versuche auch, eine Methode zu finden, um zu überprüfen, ob es 3 verschiedene minimale Spannbäume hat. Die naive Lösung, über die ich nachgedacht habe, besteht darin, den Kruskal-Algorithmus einmal auszuführen und das Gesamtgewicht des minimalen Spannbaums zu ermitteln. Entfernen Sie später eine Kante aus dem Diagramm, führen Sie Kruskals Algorithmus erneut aus und prüfen Sie, ob das Gewicht des neuen Baums dem Gewicht des ursprünglichen minimalen Spannbaums entspricht, und zwar für jede Kante im Diagramm. Die Laufzeit ist O (| V || E | log | V |), was überhaupt nicht gut ist, und ich denke, es gibt einen besseren Weg, dies zu tun.

Jeder Vorschlag wäre hilfreich, danke im Voraus


Es wäre schön, einen solchen Algorithmus zu kennen, aber er wird dieses aktuelle Problem nicht lösen
itamar

2
Der Graph wird genau dann einen eindeutigen minimalen Spannbaum haben, wenn (1) für jede Partition von V ( G ) in zwei Teilmengen die minimale Gewichtungskante mit einem Endpunkt in jeder Teilmenge eindeutig ist und (2) die maximale Gewichtung Kante in jedem Zyklus von G ist einzigartig. GV(G)G
Juho

Beantworten diese Fragen eins und zwei Ihre Frage bereits?
Juho

In Aufgabe 23-1 in CLRS erfahren Sie, wie Sie die zweitbeste MST in . O(n2)
Kaveh

Antworten:


7

Kapoor & Ramesh ( richtige Version von SIAM J. Comput. , Kostenlose (?) Version der persönlichen Website ) gibt einen Algorithmus zum Auflisten aller minimalen Spannweiten in gewichteten und ungewichteten Diagrammen an.

Mein Verständnis der Grundidee ist, dass Sie mit einem MST beginnen und dann die Kanten vertauschen, die entlang der Zyklen im Diagramm liegen (solange die Gewichte in Ordnung sind, ersetzen Sie eine Kante durch eine andere, von der Sie wissen, dass sie den Baum wieder verbindet). .

O(N|V|)N


k

1
@Raphael, ich hatte keine Zeit, mich wirklich damit auseinander zu setzen (yay assignation marking), aber meines groben Verständnisses nach sollte es möglich sein - es beginnt mit einigen MST und generiert dann nacheinander andere daraus.
Luke Mathieson

1
nn2

1
O(|V|)

1
Nach einem schnellen Lesen generiert der gewichtete Algorithmus die Bäume in aufsteigender Gewichtsreihenfolge (offensichtlich ausgehend von einem MST). So sollte es für die Zwecke des OP sein.
Luke Mathieson

2

Man kann zeigen, dass der Kruskal-Algorithmus jeden minimalen Spannbaum finden kann; siehe hier .

kk


5
kkK1,5

@vonbrand Guter Punkt. Wir können natürlich weiterhin alle Zweige der Berechnung abschließen, aber dann wird die Laufzeit durch die Anzahl der Spannbäume bestimmt, die exponentiell sein können.
Raphael

1

Um festzustellen, ob es mehr als einen MST gibt, betrachten Sie zB den Kruskal-Algorithmus. Die einzige Möglichkeit, verschiedene MSTs zu konstruieren, besteht darin, Kanten wegzulassen, indem eine andere ausgewählt wird, wenn mehrere mit demselben Gewicht vorhanden sind. Aber diese Kanten mit dem gleichen Gewicht könnten ausgeschlossen worden sein, weil sie einen Zyklus mit leichteren Kanten gebildet haben ...

Sie sollten also den Kruskal-Algorithmus ausführen und, wenn mehrere Kanten mit demselben Gewicht zu berücksichtigen sind, alle hinzufügen, die hinzugefügt werden können, ohne Zyklen zu erstellen. Wenn eine Kante dieses Gewichts übrig bleibt und kein Zyklus mit einer der Kanten mit niedrigeren Gewichten (die zuvor hinzugefügt wurden) geschlossen wird, gibt es mehr als eine MST. Die Überprüfung, ob es genau 2 oder 3 oder mehr gibt, usw. sieht viel schwieriger aus ...


0

Modifizieren des Kruskal-Algorithmus: Beim Ordnen der Kanten werden Kanten mit gleichem Gewicht gruppiert. Überprüfen Sie nun an dem Punkt, an dem Sie die Kanten der Reihe nach verarbeiten, jedes Mal, wenn Sie einen neuen Cluster erreichen, alle Kanten separat und entfernen Sie diejenigen aus dem Cluster, die einen Zyklus schließen würden, vorausgesetzt, was vor dem Cluster erstellt wurde. Führen Sie dann alle verbleibenden Kanten im Cluster aus, und versuchen Sie, sie dem MST hinzuzufügen. Wenn einer von ihnen einen Zyklus schließt, dann war dies notwendigerweise auf andere Kanten desselben Clusters zurückzuführen, die zuvor eingefügt wurden, was bedeutet, dass Sie mehr als einen MST haben.

Diese Lösung bewahrt die Komplexität des Kruskal-Algorithmus, erhöht jedoch die Zeit für jede verarbeitete Kante.


Sie scheinen zu behaupten, dass Sie einen ganzen Cluster in konstanter Zeit verarbeiten können, aber ich sehe keine offensichtliche Konstante, die an die Größe eines Clusters gebunden ist. Könnten Sie näher erläutern, wie diese Phase durchgeführt wird?
David Richerby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.