示例#1
0
 // 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));
        }