# 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; } };