Zakładam, że nie masz ujemnie ważonych krawędzi, ponieważ może to nie działać, jeśli występują ujemne wagi.
Algorytm
Dla każdej krawędzi oznacz je od do1n
Niech waży A numeru krawędziaii
Niech waga B numeru krawędzi ibii
Przygotuj ten stół
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
Każdy element tabeli jest iloczynem wiersza i kolumny.
Dla każdej krawędzi zsumuj odpowiedni wiersz tabeli i kolumnę (pamiętaj o usunięciu elementu w przecięciu, ponieważ został on zsumowany dwukrotnie).
Znajdź krawędź, która ma największą sumę, usuń ją, jeśli nie rozłączy wykresu. W przeciwnym razie zaznacz krawędź jako niezbędną. Jeśli krawędź została usunięta, wypełnij jej wiersze i kolumny wartością 0.
Poprawność
Rezultatem jest oczywiście drzewo.
Wynik jest oczywiście szeroki, ponieważ żadne wierzchołki nie są odłączone.
Wynik jest minimalny? Jeśli istnieje inna krawędź, której usunięcie spowoduje utworzenie mniejszego drzewa opinającego na końcu algorytmu, wówczas krawędź ta zostałaby najpierw usunięta i unieważniona. (gdyby ktoś pomógł mi uczynić to nieco bardziej rygorystycznym / i / lub kontrprzykładowym, byłoby świetnie)
Środowisko wykonawcze
Oczywiście wielomian w.|V|
edytować
(2,11),(11,2),(4,6) jest nie przykładem licznika.
a1=2,a2=11,a3=4
b1=11,b2=2,b3=6
Następnie
| 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) zostaje usunięty.
Skończ z(2,11),(4,6)=6∗17=102
Inne drzewa rozpinające są
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169