// run Prim's algorithm private void prim(EdgeWeightedGraph G, int s) { scan(G, s); while (!pq.IsEmpty) { // better to stop when mst has V-1 edges Edge e = pq.DeleteMin(); // smallest edge on pq int v = e.Either, w = e.other(v); // two endpoints //assert marked[v] || marked[w]; Contract.Assert(marked[v] || marked[w]); if (marked[v] && marked[w]) { continue; // lazy, both v and w already scanned } mst.Enqueue(e); // add e to MST Weight += e.Weight; if (!marked[v]) { scan(G, v); // v becomes part of tree } if (!marked[w]) { scan(G, w); // w becomes part of tree } } }
private Queue <Edge> mst = new Queue <Edge>(); // edges in MST /** * Compute a minimum spanning tree (or forest) of an edge-weighted graph. * @param G the edge-weighted graph */ public KruskalMST(EdgeWeightedGraph G) { // more efficient to build heap by passing array of edges MinPQ <Edge> pq = new MinPQ <Edge>(); foreach (Edge e in G.Edges) { pq.Insert(e); } // run greedy algorithm UF uf = new UF(G.V); while (!pq.IsEmpty && mst.Size < G.V - 1) { Edge e = pq.DeleteMin(); int v = e.Either; int w = e.other(v); if (!uf.Connected(v, w)) { // v-w does not create a cycle // merge v and w components uf.Union(v, w); mst.Enqueue(e); // add edge e to mst weight += e.Weight; } } // check optimality conditions //assert ; Contract.Assert(check(G)); }