#pragma once #include <cgv/math/adjacency_list.h> #include <cgv/math/union_find.h> #include <cgv/math/fibo_heap.h> namespace cgv{ namespace math{ template <typename v_type> void mst_prim(adjacency_list<v_type> &graph, adjacency_list<v_type> &mst) { if(graph.nverts() == 0) return; std::vector<int> *vflags = new std::vector<int>(graph.nverts(),0); mst.resize(graph.nverts()); mst.directed=false; fibo_heap<double,adjacency_list<v_type>::edge_type*> heap; (*vflags)[0]=1; for(unsigned ei = 0; ei < graph.vertex(0).edges.size(); ei++) { adjacency_list<v_type>::edge_type *e = &(graph.vertex(0).edges[ei]); heap.insert(e->weight,e); } while(!heap.empty()) { adjacency_list<v_type>::edge_type *e = heap.delete_min(); if((*vflags)[e->end] == 0) { mst.add_edge(*e); (*vflags)[e->end] = 1; for(unsigned ei = 0; ei < graph.vertex(e->end).edges.size(); ei++) { adjacency_list<v_type>::edge_type *e2 = &(graph.vertex(e->end).edges[ei]); if( (*vflags)[e2->end] == 0) heap.insert(e2->weight,e2); } } } delete vflags; } } }