Teoría de grafos: ¿en qué se diferencian los árboles de expansión construidos a partir de Prim de los árboles de expansión construidos a partir de Kruskal?

Puedo responder una pregunta ligeramente diferente, pero relacionada.
Es fácil modificar el algoritmo de Prim para producir árboles de expansión con un diámetro menor que los árboles aleatorios. Recuerde que el algoritmo de Prim es muy similar en estructura al algoritmo de ruta más corta de una sola fuente de Dijkstra (sin pesos de borde, se puede usar Breadth-First Search), por lo que en lugar de seleccionar un borde aleatorio en cada paso, puede seleccionar un borde que Dijkstra algoritmo (o BFS, en su caso) seleccionaría. No parece haber una modificación fácil y computacionalmente eficiente del algoritmo de Kruskal con permutación inicial aleatoria para lograr esto.

En un caso más general con pesos de borde no triviales, puede formar un híbrido de algoritmos de Prim y Dijkstra calculando una combinación lineal convexa de longitud de borde (la prioridad en el algoritmo de Prim) y la longitud de ruta prospectiva (la prioridad en el algoritmo de Dijkstra). El coeficiente que controla la combinación lineal es una buena perilla para ajustar si está buscando árboles de expansión útiles. En un proyecto reciente, utilizamos este truco para encontrar árboles de expansión de baja extensión en gráficos grandes.

Una cosa a tener en cuenta aquí es que es posible que desee cambiar su terminología.

Comencemos con lo que llama su implementación de Kruskal. Aquí, realmente implementó un algoritmo de árbol de expansión mínimo. Su paso “permutar el orden de todas las aristas” es equivalente a, por ejemplo, “asignamos un número real aleatorio de [0,1] a cada arista”.

Ahora, dado que no hay dos aristas que tengan el mismo peso (lo que ocurre con la probabilidad 1 para nuestros reales aleatorios), el árbol de expansión mínimo siempre es único. Si ejecutara el algoritmo de Prim (*) dado el mismo conjunto de pesos de borde, terminaría exactamente con el mismo árbol de expansión.

Lo que llama su implementación de Prim es en realidad un algoritmo diferente que solo se parece.

(* 1) Un nombre más apropiado para usar es el algoritmo de Jarník-Prim. Dar crédito a quien crédito merece.

Una diferencia fundamental es que el algoritmo de Prim comienza con un árbol en el primer paso y sigue teniendo un árbol en cada paso posterior, mientras que el algoritmo de Kruskal en general produce un bosque desconectado hasta el paso final.