Named after Robert C. Prim who discovered the algorithm in 1957. However, it was discovered that Vojtěch Jarník discovered it in 1930, so it is sometimes know as the Prim-Jarník algorithm.
Asymptotic Complexity
$O((m+n)\log n)$
Pseudo Code
Naive Implementation
The pseudo code below is a particularly slow implementation ($O(mn)$) of Prim’s algorithm. However, this simple implementation makes the algorithm easy to understand.
G = connected, undirected graph
T = empty set (will contain edges in MST)
cost = 0
find_smallest:
G = input graph
smallest = NULL
// Loop through each edge where tail vertex is conquered and head vertex is not conqured
for each vertex (v) in G where v is conquered:
for each edge in v where edge->head is NOT conquered:
if smallest is NULL OR edge->weight < smallest->weight:
smallest = edge
return smallest
mark first vertex conquered
e = find_smallest G
while e != NULL:
add e to T
cost += e->weight
mark e->head conquered
edge = find_smallest G
return T and cost
Heap-Based Implementation
This version is more complex, but results in a considerably faster run time ($O((m+n)\log n)$)
Invariants:
- Heap contains vertices that have that have not yet been spanned
- Highest priority element in the heap is the next vertex to be conquered
G = connected, undirected graph
T = empty set (will contain edges in MST)
H = empty heap
cost = 0
find_winning_edge:
edges = edges to search
return cheapest edge where head is conquered
return NULL if no edges qualify
mark first vertex conquered
for v that is not conquered:
winner = find_winning_edge v->edges
if winner is NULL:
score = infinity
else
score = winner->weight
add v to H using score as the heap key value
while H is not empty:
v = extracted min from H
mark v as conquered
cost += v.score
add winner to T (calculated in previous loop)
for every edge in v where the head is not conquered:
winner = cheapest edge in edge->head->edges
if winner is NULL:
score = infinity
else
score = winner->weight
recacluate H for winner->head
return T cost
Source Code
Relevant Files:
Click here for build and run instructions