Hace aproximadamente un año, un amigo y yo pensamos en una forma de implementar el algoritmo de Kruskal para gráficos densos en un límite mejor que el habitual (sin suponer aristas previamente ordenadas). Específicamente, logramos en todos los casos, similar a Prim cuando se implementa usando matrices de adyacencia.
He publicado un poco sobre el algoritmo en mi blog , incluido el código C ++ y los puntos de referencia, pero esta es la idea general:
Mantenga un nodo representativo para cada componente conectado. Inicialmente, todos los nodos se representan a sí mismos.
Mantenga un vector
dist[i]
tal que, para cada componentei
, tenga el incidente de borde de cruce de componente más ligeroi
.Cuando encuentre el borde más ligero que cruza las particiones, simplemente encuentre
i
que minimiza el peso dedist[i]
, en tiempo lineal.Al unir dos componentes y , modifique la matriz de adyacencia , de modo que ahora para todos los componentes k , y marque i ya no es representativo de su componente conectado ( ahora solo quedará j ).
La contratación del borde más ligero y el hallazgo de dicho borde se pueden hacer en tiempo lineal. Hacemos esto veces para encontrar el MST. Se necesita un poco de contabilidad para encontrar realmente qué borde queremos agregar al MST, pero no aumenta la complejidad. Por lo tanto, el tiempo de ejecución es . La implementación es solo un par de bucles for.
¿Es esta versión de Kruskal conocida en la literatura?
fuente