La teoría de grafos - - algoritmos de árbol de expansión mínimo -LazyPrim

# include " MinHeap.h " 
el uso de  espacio de nombres std; 

plantilla <nombre de tipo gráfico, nombretipo Peso>
 clase LazyPrimMST 
{ 
privado : 
    Gráfico y G; 
    MinHeap <Edge <>> Peso pq; // 最小堆,优先队列
    bool * marcados; 
    vector <Edge <Peso >> MST; // 最小生成树 
    Peso mstWeight; // 最小权

    vacío visita ( int v) { 
        assert ( ! Marcada [v]); 
        marcada [v] = verdadero ;
        TypeName Graph :: adj adjIterator (G, v); 
        para (Edge <Peso> * e = adj.begin () ;! adj.end (); e = adj.next ())
             si (marcado [e-> otro (v)]) 
                pq.insert ( * e ); 
    } 
Pública : 
    LazyPrimMST (Gráfico y gráfico): G (gráfico), pq (MinHeap <Edge <>> Peso (graph.E ())) { 
        marcada = nueva  bool [GV ()];
        para ( int i = 0 ; i <GV (); i ++ ) 
            marcado [i] = false ; 
        mst.clear (); 

        // Lazy Prim
        visita ( 0 )
         , mientras que (! pq.isEmpty ()) 
        { 
            Edge <Peso> e = pq.extractMin ();
            si (marcado [eV ()] == marcado [ew ()])
                 continuar ; 
            mst.push_back (e); 
            si (! marcada [eV ()]) 
                visita (eV ()); 
            otra 
                visita (EW ()); 
        } 
        MstWeight = mst [ 0 ] .wt ();
        para ( int i = 1 ; i <mst.size (); i ++ ) 
            mstWeight+ = Mst [i] .wt (); 
        
    }; 
    ~ LazyPrimMST () {
         delete [] marcada; 
    }; 
    vector <Edge <>> Peso mstEdges () {
         retorno MST; 
    } 
    Consecuencia Peso () { 
        volver mstWeight; 
    } 
};

 

Supongo que te gusta

Origin www.cnblogs.com/Erick-L/p/12641314.html
Recomendado
Clasificación