Circa un anno fa, io e un amico abbiamo pensato a un modo per implementare l'algoritmo di Kruskal per i grafici densi in modo migliore rispetto al solito limite (senza assumere bordi preordinati). In particolare, otteniamo in tutti i casi, simile a quello di Prim quando implementato usando matrici di adiacenza.
Ho pubblicato un post sull'algoritmo nel mio blog , inclusi codice C ++ e benchmark, ma ecco l'idea generale:
Mantenere un nodo rappresentativo per ciascun componente collegato. Inizialmente, tutti i nodi si rappresentano.
Mantenere un vettore in modo
dist[i]tale che, per ogni componentei, si verifichi l'incidente con il bordo di attraversamento del componente più leggeroi.Quando trovi il bordo più leggero che attraversa le partizioni, trova semplicemente
iche minimizza il peso didist[i], in tempo lineare.per tutti i componenti k e contrassegnare i come non più rappresentativo del componente collegato (rimarràsolo j ).
La contrazione del bordo più leggero e il rilevamento di detto bordo possono quindi essere entrambi eseguiti in tempo lineare. Facciamo questo volte per trovare il MST. È necessaria una piccola contabilità per trovare effettivamente quale vantaggio vogliamo aggiungere al MST, ma non aumenta la complessità. Pertanto il tempo di esecuzione è Θ ( n 2 ) . L'implementazione è solo un paio di loop.
Questa versione di Kruskal è ben nota in letteratura?