Permítanme ofrecer un algoritmo de mejora:
- primera construcción de un árbol arbitraria (usando BFS o DFS)
- a continuación, elegir un borde exterior del árbol, se suman al árbol, se formará un ciclo, soltar el borde de peso más pequeño en el ciclo.
- continuar haciendo esto UTIL todos los bordes de descanso se consideran
Por lo tanto, vamos a llegar al árbol de máxima expansión.
Este árbol satisface cualquier borde exterior del árbol, si se añade formará un ciclo y el borde exterior < = cualquier pesos de las aristas en el ciclo
De hecho, esta es una condición necesaria y suficiente para una spanning tree para ser máximo spanning tree.
Pf.
Necesario: es obvio que esto es necesario, o podríamos cambiar el borde para hacer un árbol con una mayor suma de pesos de borde.
Suficiente: Supongamos que el árbol T1 cumple esta condición y T2 es el árbol de expansión máximo.
Luego, para los bordes T1 ∪ T2, hay bordes T1 solamente, bordes T2 solo, bordes T1 ∩ T2, si agregamos un borde solo T1 (x1, xk) a T2, sabemos que lo hará forma un ciclo, y reclamamos, en este ciclo, debe existir un borde T2-only que tenga los mismos pesos de borde que (x1, xk). Entonces podemos intercambiar estos bordes produciendo un árbol con un borde más en común con T2 y tiene la misma suma de pesos de borde, repitiendo hacer esto obtenemos T2. entonces T1 también es un árbol de expansión máximo.
probar la afirmación:
suponer que no es cierto, en el ciclo debemos tener un T2-T1 única ventaja ya que es un árbol. Si ninguno de los bordes solo T2 tiene un valor igual al de (x1, xk), entonces cada uno de los bordes solo T2 forma un bucle con el árbol T1, entonces T1 tiene un bucle conduce a una contradicción.
Este algoritmo tomado de las notas del profesor UTD R. Chandrasekaran. Puede consultar aquí: Single Commodity Multi-terminal Flows
¿Funciona también para Prim? – banarun
@banarun Muy tarde para la fiesta, pero sí, lo hace. – CJxD