Ich gehe davon aus, dass Sie keine negativ gewichteten Kanten erhalten, da dies bei negativen Gewichten möglicherweise nicht funktioniert.
Algorithmus
Beschriften Sie sie für jede Ihrer Kanten mit bisn1n
Es sei Gewicht A der Kantennummer iaii
Es sei Gewicht B der Kantennummer ibii
Stellen Sie diese Tabelle auf
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
Dabei ist jedes Tabellenelement das Produkt aus Zeile und Spalte.
Summieren Sie für jede Kante die entsprechende Tabellenzeile und -spalte (und denken Sie daran, das Element in der Schnittmenge zu entfernen, da es zweimal summiert wurde).
Suchen Sie die Kante mit der größten Summe, und löschen Sie diese Kante, wenn das Diagramm dadurch nicht getrennt wird. Markieren Sie die Kante als wesentlich, ansonsten. Wenn eine Kante gelöscht wurde, füllen Sie ihre Zeilen und Spalten mit 0.
Richtigkeit
Das Ergebnis ist offensichtlich ein Baum.
Das Ergebnis ist offensichtlich überspannend, da keine Eckpunkte getrennt werden.
Das Ergebnis ist minimal? Wenn es eine andere Kante gibt, deren Löschung am Ende des Algorithmus einen kleineren Spannbaum erzeugt, dann wäre diese Kante zuerst gelöscht und auf Null gesetzt worden. (Wenn mir jemand helfen könnte, dieses Beispiel etwas strenger und / oder gegnerischer zu gestalten, dann wäre das großartig.)
Laufzeit
Offensichtlich Polynom in.|V|
bearbeiten
(2,11),(11,2),(4,6) ist kein Gegenbeispiel.
a1=2,a2=11,a3=4
b1=11,b2=2,b3=6
Dann
| 2 11 4
---+--------------------
11 | 22 121 44
2 | 4 22 8
6 | 12 66 24
(4,6)(2,11)(11,2)=44+8+24+66+12=154=22+4+12+121+44=203=121+22+66+4+8=221
(11,2) wird entfernt.
Beenden Sie mit(2,11),(4,6)=6∗17=102
Andere Spannbäume sind
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169