Considere una gráfica . Cada borde tiene dos pesos y . Encuentre un árbol de expansión que minimice el producto . El algoritmo debe ejecutarse en tiempo polinómico con respecto a .
Me resulta difícil adaptar cualquiera de los algoritmos tradicionales en árboles de expansión (Kruskal, Prim, Edge-Deletion). ¿Cómo resolverlo? ¿Alguna pista?
Respuestas:
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 an1 n
Deje pesar A del borde número iai i
Sea peso B del borde número ibi i
Dibuja esta tabla
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
Luego
Termina con(2,11),(4,6)=6∗17=102
Otros árboles de expansión son
fuente
Esta es la solución de http://www.cnblogs.com/autsky-jadek/p/3959446.html .
Podemos ver cada árbol de expansión como un punto en el plano , donde es la suma de peso , y es la suma de peso . El objetivo es minimizar .x ∑ e ∈ T Ax−y x ∑e∈TAe ∑e∈TBe xy
Encontrar el árbol de expansión mínima en función del peso y peso . Así que tenemos dos puntos en el plano xy . En todos los puntos del árbol de expansión en el plano, tiene el mínimo , tiene el mínimo .BA B A,B A x B y
Ahora nuestro objetivo es encontrar un punto en el triángulo que tenga una distancia máxima a la línea , de modo que podamos minimizar el valor de para todos los puntos en el triángulo .O A BC OAB AB xy C ABC
Porque .2SABC=|AB−→−×AC−→−|=(Bx−Ax,By−Ay)×(Cx−Ax,Cy−Ay)=(Bx−Ax)⋅Cy+(Ay−By)⋅Cx−Ay(Bx−Ax)+Ax(By−Ay)
Observe que es una constante, por lo que ahora a maximizar . Entonces hacemos un nuevo gráfico , mientras que el peso . Ahora ejecutamos un árbol de expansión máxima en para obtener el punto . ( B x - A x )⋅ C y +( A y - B y )⋅ C x G ′ =(V,E)w(e)= B e ( B x - A x )+ C x ( A yAy(Bx−Ax)+Ax(By−Ay (Bx−Ax)⋅Cy+(Ay−By)⋅Cx G′=(V,E) w(e)=Be(Bx−Ax)+Cx(Ay−By) G′ C
Ejecutar el algoritmo anterior en de forma recursiva, hasta que no hay más árboles de expansión entre y .B C , A C OOBC,OAC BC,AC O
Ahora tenemos un conjunto de posibles árboles de expansión. Calcule el valor para cada árbol para obtener el árbol mínimo.xy
fuente