cgv
Loading...
Searching...
No Matches
mst.h
1#pragma once
2#include <cgv/math/adjacency_list.h>
3#include <cgv/math/union_find.h>
4#include <cgv/math/fibo_heap.h>
5
6
7namespace cgv{
8 namespace math{
9
10
11
12
13template <typename v_type>
14void mst_prim(adjacency_list<v_type> &graph, adjacency_list<v_type> &mst)
15{
16 if(graph.nverts() == 0)
17 return;
18
19 std::vector<int> *vflags = new std::vector<int>(graph.nverts(),0);
20
21 mst.resize(graph.nverts());
22 mst.directed=false;
23
24
25 fibo_heap<double,adjacency_list<v_type>::edge_type*> heap;
26
27 (*vflags)[0]=1;
28 for(unsigned ei = 0; ei < graph.vertex(0).edges.size(); ei++)
29 {
30 adjacency_list<v_type>::edge_type *e = &(graph.vertex(0).edges[ei]);
31 heap.insert(e->weight,e);
32 }
33
34 while(!heap.empty())
35 {
36 adjacency_list<v_type>::edge_type *e = heap.delete_min();
37
38 if((*vflags)[e->end] == 0)
39 {
40
41 mst.add_edge(*e);
42 (*vflags)[e->end] = 1;
43 for(unsigned ei = 0; ei < graph.vertex(e->end).edges.size(); ei++)
44 {
45 adjacency_list<v_type>::edge_type *e2 = &(graph.vertex(e->end).edges[ei]);
46 if( (*vflags)[e2->end] == 0)
47 heap.insert(e2->weight,e2);
48 }
49 }
50 }
51
52 delete vflags;
53
54
55
56
57
58}
59
60
61
62 }
63}
the cgv namespace
Definition print.h:11