Eine vorherige Antwort gibt einen Algorithmus an, um zu bestimmen, ob es mehrere MSTs gibt, die für jede Kante nicht in G enthalten ist, den Zyklus finden, der durch Hinzufügen von e zu einer vorberechneten MST erstellt wurde, und prüfen, ob e nicht die eindeutig schwerste Kante in diesem Zyklus ist. Dieser Algorithmus wird wahrscheinlich in der Zeit O ( | E | | V | ) ausgeführt .eGeeO ( | E| | V| )
Ein einfacher Algorithmus , um zu bestimmen , ob es mehrere MSTs von G in zeit KomplexitätO ( | E| Log( | V| )) .
1. Führen Sie den Kruskal-Algorithmus auf , um einen MST m zu finden .Gm
2. Versuchen Sie erneut, Kruskals Algorithmus auf auszuführen. Wenn wir in diesem Lauf die Wahl zwischen Kanten mit gleichem Gewicht haben, versuchen wir zuerst die Kanten, die nicht in m sind. Danach versuchen wir die Kanten in m . Immer wenn wir eine Kante gefunden haben, die nicht in m enthalten ist, die zwei verschiedene Bäume verbindet, behaupten wir, dass es mehrere MSTs gibt, die den Algorithmus beenden.Gmmm
3. Wenn wir hier angekommen sind, behaupten wir, dass eine eindeutige MST hat.G
Ein gewöhnlicher Durchlauf des Kruskal-Algorithmus benötigt Zeit. Die zusätzliche Auswahl von Kanten, die nicht in m angegeben sind, kann in O ( | E | ) erfolgen . Der Algorithmus erreicht also O ( | E | log ( | V | ) ) Zeitkomplexität.O ( | E| Log( | V| ))mO ( | E| )O ( | E| Log( | V| ))
Warum kann dieser Algorithmus feststellen, ob mehrere MSTs vorhanden sind?
Angenommen, wir haben ein MST , das nicht dasselbe wie m ist . Es genügt zu zeigen, dass der auf G ausgeführte Algorithmus Schritt 3 nicht erreichen wird, da die am Ende von Schritt 2 gefundene Kante, die nicht in m ist und zwei verschiedene Bäume verbindet, in der resultierenden MST enthalten gewesen wäre, wenn wir Kruskals ausgeführt hätten Algorithmus zur Vervollständigung. Lassen w das größte Gewicht so beschaffen sein , dass für jede Kante mit einem Gewicht von weniger als w , es ist m , wenn und nur wenn es in den m ' . Da m und m ' die gleiche Anzahl von Gewichtskanten w haben , existieren Gewichtskantenm′mGmwwmm′mm′w , die in m ' aber nicht in m sind . Wenn der Algorithmus beendet wurde, bevor Kanten dieser Kanten verarbeitet wurden, sind wir fertig. Ansonsten wird angenommen, dass der Algorithmusjetztdie erste Kante e ' unter diesen Kanten verarbeitet. Sei S die Menge aller Kanten, die bisher erhalten geblieben sind, um in den resultierenden MST einbezogen zu werden. S ⊂ m . Da der Algorithmus die Verarbeitung der Gewichtskante w nicht in m beendet hat, wie z. B. e ' , darf er nicht mit der Verarbeitung der Gewichtskanten w in m begonnen haben . Also Kanten in Swm′me′SS⊂mwme′wmSwiegen weniger als . Das heißt S ⊂ m ' . Denken Sie daran, dass e ' in m ' ist . Da { e ' } ∪ S ⊂ m ' ist , wobei m ' ein Baum ist , muss e ' zwei verschiedene Bäume in S verbinden, und der Algorithmus wird an dieser Stelle beendet.wS⊂m′.e′m′{e′}∪S⊂m′m′e′S
Hinweis zur weiteren Entwicklung
Schritt 1 und Schritt 2 können verschachtelt werden, damit wir den Algorithmus so schnell wie möglich beenden können, ohne Kanten größerer Gewichte zu verarbeiten.
Wenn Sie die Anzahl der MSTs berechnen möchten, können Sie eine Antwort darauf überprüfen , wie die Anzahl der MSTs berechnet werden soll .