Algoritmo di Prim
L'algoritmo trova l'MST partendo da e propagando la creazione dell'albero sugli archi con pesi minori:
prim(G, w, r)
Q = G.V // Coda di minima priorità
d = {} // Contiene il peso d[v] più piccolo per la connessione al nodo v
𝜋 = {} // Contiene il nodo 𝜋[v] (vicino di v) da cui è originato il peso d[v]
for each u in G.V
d[u] = +∞
𝜋[u] = NIL
d[r] = 0
while Q.heap_size > 0
u = extract_min(Q) // Sceglie il nodo u con d[u] più piccolo
for each v in neighbors(G, u)
if contains(Q, v) and w(u, v) < d[v]
d[v] = w(u, v) // Potrebbe causare un riordinamento di Q
𝜋[v] = u
A = {}
for each v in G.V
e = (𝜋[v], v)
if contains(G.E, e) and v != r // Evita 𝜋[v] = 𝜋[r] = NIL
add(A, e)
return A
che è corretto perchè rispetta il teorema fondamentale degli MST. Infatti, ad ogni istante, si ha che: e dato che , l'arco non attraverserà mai il taglio , cioè il bordo tra i nodi già visitati e quelli ancora da visitare. Inoltre, il prossimo proviene sicuramente dall'arco leggero del taglio.
La complessità si ricava con, sapendo che :
dove, il primo è dato dal costo della extract_min su Q, il dalle neighbors(u) iterazioni per il nodo estratto u (che si somma a per la stretta di mano) e l'ultimo dall'assegnamento a d[v].
Per esempio, partendo dal nodo nel grafo
i passaggi effettuati dall'algoritmo sono:
| Step | d[1], 𝜋[1] | d[2], 𝜋[2] | d[3], 𝜋[3] | d[4], 𝜋[4] |
|---|---|---|---|---|
| 0 | 0, NIL | ∞, NIL | ∞, NIL | ∞, NIL |
| 1 | >0, NIL< | 4, 1 | 4, 1 | 2, 1 |
| 2 | 0, NIL | 4, 1 | 2, 4 | >2, 1< |
| 3 | 0, NIL | 4, 1 | >2, 4< | 2, 1 |
| 4 | 0, NIL | >4, 1< | 2, 4 | 2, 1 |