Asumiré que no tienes bordes ponderados negativos, porque esto puede no funcionar si hay pesos negativos.
Algoritmo
Para cada uno de sus bordes, rotúlelos de an1n
Deje pesar A del borde número iaii
Sea peso B del borde número ibii
Dibuja esta tabla
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
Con cada uno de los elementos de la tabla como producto de fila y columna.
Para cada borde, sume la fila y columna de la tabla relevante (y recuerde eliminar el elemento en la intersección ya que se ha sumado dos veces).
Encuentre el borde que tiene la suma más grande, elimine este borde si no desconecta el gráfico. Marque el borde como esencial de lo contrario. Si se ha eliminado un borde, complete sus filas y columnas con 0.
Exactitud
El resultado es obviamente un árbol.
El resultado obviamente se extiende ya que no hay vértices desconectados.
El resultado es mínimo? Si hay otro borde cuya eliminación creará un árbol de expansión más pequeño al final del algoritmo, entonces ese borde se habría eliminado y anulado primero. (si alguien pudiera ayudarme a hacer esto un poco más riguroso y / o contraejemplo, entonces sería genial)
Tiempo de ejecución
Obviamente polinomio en.|V|
editar
(2,11),(11,2),(4,6) no es un contraejemplo.
a1=2,a2=11,a3=4
b1=11,b2=2,b3=6
Luego
| 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) se elimina.
Termina con(2,11),(4,6)=6∗17=102
Otros árboles de expansión son
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169