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:

Stepd[1], 𝜋[1]d[2], 𝜋[2]d[3], 𝜋[3]d[4], 𝜋[4]
00, NIL, NIL, NIL, NIL
1>0, NIL<4, 14, 12, 1
20, NIL4, 12, 4>2, 1<
30, NIL4, 1>2, 4<2, 1
40, NIL>4, 1<2, 42, 1