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
Antworten:
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). .
quelle
Man kann zeigen, dass der Kruskal-Algorithmus jeden minimalen Spannbaum finden kann; siehe hier .
quelle
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 ...
quelle
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.
quelle