算法-图论-最小生成树-LazyPrim

#include "MinHeap.h"
using namespace std;

template<typename Graph,typename Weight>
class LazyPrimMST
{
private:
    Graph &G;
    MinHeap<Edge<Weight>> pq;//最小堆,优先队列
    bool *marked;
    vector<Edge<Weight>> mst;//最小生成树
    Weight mstWeight;//最小权

    void visit(int v){
        assert(!marked[v]);
        marked[v] =true;
        typename Graph::adjIterator adj(G,v);
        for(Edge<Weight>* e=adj.begin();!adj.end();e=adj.next())
            if(!marked[e->other(v)])
                pq.insert(*e);
    }
public:
    LazyPrimMST(Graph &graph):G(graph),pq(MinHeap<Edge<Weight>>(graph.E())){
        marked = new bool[G.V()];
        for(int i=0;i<G.V();i++)
            marked[i] = false;
        mst.clear();

        //Lazy Prim
        visit(0)
        while (!pq.isEmpty())
        {
            Edge<Weight> e = pq.extractMin();
            if(marked[e.V()] == marked[e.w()])
                continue;
            mst.push_back(e);
            if(!marked[e.V()])
                visit(e.V());
            else
                visit(e.w());
        }
        mstWeight = mst[0].wt();
        for(int i=1;i< mst.size();i++)
            mstWeight += mst[i].wt();
        
    };
    ~LazyPrimMST(){
        delete[] marked;
    };
    vector<Edge<Weight>> mstEdges(){
        return mst;
    }
    Weight result(){
        return mstWeight;
    }
};

 

posted @ 2020-04-06 11:37  Erick-LONG  阅读(221)  评论(0编辑  收藏  举报