Minimum Spanning Trees
Definition
Given an undirected graph, a spanning tree T is a subgraph of G, which has the following properties.
Is connected.
Is acyclic.
Includes all of the vertices.
A minimum spanning tree is a spanning tree of minimum total weight. A shortest paths tree depends on the start vertex, while there is no source for a minimum spanning tree.
Cut Property
A cut is an assignment of a graph’s nodes to two non-empty sets.
A crossing edge is an edge which connects a node from one set to a node from the other set.
Given any cut, minimum weight crossing edge is in the MST.

Generic MST Finding Algorithm
Start with no edges in the MST.
Find a cut that has no crossing edges in the MST.
Add smallest crossing edge to the MST.
Repeat until V-1 edges.
Prim’s Algorithm
Start from some arbitrary start node.
Repeatedly add shortest edge that has one node inside the MST under construction.
Repeat until V-1 edges.
Implementation
Prim’s and Dijkstra’s algorithms are similar, however:
Dijkstra's considers "distance from the source".
Prim's considers "distance from the tree."
public class PrimMST {
public PrimMST(EdgeWeightedGraph G) {
edgeTo = new Edge[G.V()];
distTo = new double[G.V()];
marked = new boolean[G.V()];
fringe = new SpecialPQ < Double > (G.V());
distTo[s] = 0.0;
setDistancesToInfinityExceptS(s);
insertAllVertices(fringe);
/* Get vertices in order of distance from tree. */
while (!fringe.isEmpty()) {
int v = fringe.delMin();
scan(G, v);
}
}
private void scan(EdgeWeightedGraph G, int v) {
marked[v] = true;
for (Edge e: G.adj(v)) {
int w = e.other(v);
if (marked[w]) {
continue;
}
if (e.weight() < distTo[w]) {
distTo[w] = e.weight();
edgeTo[w] = e;
pq.decreasePriority(w, distTo[w]);
}
}
}
}
Runtime
Priority Queue operation count, assuming binary heap based PQ.
Insertion: V, each costing
O(log V)
time.Delete-min: V, each costing
O(log V)
time.Decrease priority:
O(E)
, each costingO(log V)
time.
Overall runtime: O(V * log(V) + V * log(V) + E * logV)
. Assuming E > V, this is just O(E log V)
.
Kruskal’s Algorithm
Consider edges in increasing order of weight.
Add edge to MST unless doing so creates a cycle.
Repeat until V-1 edges.
Implementation
Adding an edge to MST means that add the edge to the ArrayList and connect the two vertices in the WeightedQuickUnion
. If the two vertices are already connected, the edge should be ingored since adding it will create a cycle.
public class KruskalMST {
private List < Edge > mst = new ArrayList < Edge > ();
public KruskalMST(EdgeWeightedGraph G) {
MinPQ < Edge > pq = new MinPQ < Edge > ();
for (Edge e: G.edges()) {
pq.insert(e);
}
WeightedQuickUnionPC uf =
new WeightedQuickUnionPC(G.V());
while (!pq.isEmpty() && mst.size() < G.V() - 1) {
Edge e = pq.delMin();
int v = e.from();
int w = e.to();
if (!uf.connected(v, w)) {
uf.union(v, w);
mst.add(e);
}
}
}
}
Runtime
Insertion: E, each costing
O(log E)
time.Delete-min:
O(E)
, each costingO(log E)
time.Union:
O(V)
, each costingO(log V)
time.IsConnected:
O(E)
, each costingO(log V)
time.Overall runtime:
O(E + V log * V + E log * V)
.Assuming E > V, this is just
O(E log V)
.
Last updated