zoukankan      html  css  js  c++  java
  • 算法-图论-最小生成树-Prim

    利用最小索引堆优化prim

    #include <iostream>
    #include <vector>
    #include <cassert>
    #include "Edge.h"
    #include "IndexMinHeap.h"
    
    using namespace std;
    
    template<typename Graph,typename Weight>
    class PrimMST
    {
    private:
        Graph &G;
        IndexMinHeap<Weight> ipq;
        vector<Edge<Weight>*> edgeTo;
        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()){
                int w = e->other(v);//相邻的顶点
                if(!marked[w]){
                    if(!edgeTo[w]){
                        ipq.insert(w,e->wt());
                        edgeTo[w]=e;
                    }else if(e->wt() < edgeTo[w]->wt()){
                        edgeTo[w]=e;
                        ipq.change(w,e->wt());
                    }
                }
            }
        }
    public:
        PrimMST(Graph &graph):G(graph),ipq(IndexMinHeap<double>(graph.V())){
            marked = new bool[G.V()];
            for(int i =0;i<G.V();i++){
                marked[i] = false;
                edgeTo.push_back(NULL);
            }
            mst.clear();
    
            //Prim
            visit(0);
            while (!ipq.isEmpty())
            {
                int v = ipq.extractMinIndex();
                assert(edgeTo[v]);
                mst.push_back(*edgeTo[v]);
                visit(v);
            };
            mstWeight = mst[0].wt();
            for(int i =1;i<mst.size();i++)
                mstWeight += mst[i].wt();
            
        };
        ~PrimMST(){
            delete[] marked;
        };
        vector<Edge<Weight>> mstEdges(){
            return mst;
        };
        Weight result(){
            return mstWeight;
        }
    
    };
  • 相关阅读:
    ssl双向认证
    keycloak管理用户权限
    Apollo单向SSL认证(2)
    Apollo单向SSL认证(1)
    apollo1.7.1初探(二)使用apollo订阅主题,发布主题消息
    apollo1.7.1初探(一)安装apollo、创建并启动broker
    Mosquito集群模式
    什么是MQTT协议?
    物影子操作
    kafka和mqtt的区别是什么?
  • 原文地址:https://www.cnblogs.com/Erick-L/p/12666258.html
Copyright © 2011-2022 走看看