Suppongo che non ti vengano dati bordi con ponderazione negativa, perché potrebbe non funzionare se ci sono pesi negativi.
Algoritmo
Per ciascuno dei bordi, etichettarli da an1n
Lascia peso A del numero del bordo ioun'ioio
Lascia che peso B del numero del bordo iBioio
Prepara questa tabella
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
Con ciascuno degli elementi della tabella il prodotto di riga e colonna.
Per ogni bordo, sommare la riga e la colonna della tabella pertinente (e ricordare di rimuovere l'elemento nell'intersezione poiché è stato sommato due volte).
Trova il bordo con la somma maggiore, eliminalo se non disconnette il grafico. Segna il bordo come essenziale altrimenti. Se un bordo è stato eliminato, riempire le sue righe e colonne con 0.
Correttezza
Il risultato è ovviamente un albero.
Il risultato è ovviamente spanning poiché nessun vertice è disconnesso.
Il risultato è minimo? Se esiste un altro bordo la cui eliminazione creerà un albero di spanning più piccolo alla fine dell'algoritmo, quel bordo sarebbe stato prima eliminato e annullato. (se qualcuno potesse aiutarmi a rendere questo un po 'più rigoroso / e / o contro esempio, sarebbe fantastico)
Runtime
Ovviamente polinomiale in.| V|
modificare
( 2 , 11 ) , ( 11 , 2 ) , ( 4 , 6 ) è non un esempio contatore.
un'1= 2 , a2= 11 , a3= 4
B1= 11 , b2= 2 , b3= 6
Poi
| 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 ) viene rimosso.
Termina con( 2 , 11 ) , ( 4 , 6 ) = 6 ∗ 17 = 102
Altri alberi spanning sono
( 11 , 2 ) , ( 4 , 6 ) = 15 ∗ 12 = 180
( 2 , 11 ) , ( 11 , 2 ) = 13 ∗ 13 = 169