3 *template <Graph, T, Heap=FibHeap, LengthMap=Graph::EdgeMap<T> >
7 *Prim(Graph G, LengthMap weight)
12 *void run() : Runs the Prim-algorithm from a random node
14 *void run(Node r) : Runs the Prim-algorithm from node s
16 *T weight() : After run(r) was run, it returns the minimum
17 * weight of a spanning tree of the component of the root.
19 *Edge tree(Node v) : After run(r) was run, it returns the
20 * first edge in the path from v to the root. Returns
21 * INVALID if v=r or v is not reachable from the root.
23 *bool conn() : After run(r) was run, it is true iff G is connected
25 *bool reached(Node v) : After run(r) was run, it is true
26 * iff v is in the same component as the root
28 *Node root() : returns the root
40 template <typename Graph, typename T,
41 typename Heap=FibHeap<typename Graph::Node, T,
42 typename Graph::NodeMap<int> >,
43 typename LengthMap=typename Graph::EdgeMap<T> >
45 typedef typename Graph::Node Node;
46 typedef typename Graph::NodeIt NodeIt;
47 typedef typename Graph::Edge Edge;
48 typedef typename Graph::OutEdgeIt OutEdgeIt;
49 typedef typename Graph::InEdgeIt InEdgeIt;
52 const LengthMap& edge_weight;
53 typename Graph::NodeMap<Edge> tree_edge;
54 typename Graph::NodeMap<T> min_weight;
55 typename Graph::NodeMap<bool> reach;
59 Prim(Graph& _G, LengthMap& _edge_weight) :
60 G(_G), edge_weight(_edge_weight),
61 tree_edge(_G,INVALID), min_weight(_G), reach(_G, false) { }
74 for ( G.first(u) ; G.valid(u) ; G.next(u) ) {
75 tree_edge.set(u,INVALID);
81 typename Graph::NodeMap<bool> scanned(G, false);
82 typename Graph::NodeMap<int> heap_map(G,-1);
89 while ( !heap.empty() ) {
92 min_weight.set(v, heap.get(v));
97 for( G.first(e,v); G.valid(e); G.next(e)) {
103 heap.push(w, edge_weight[e]);
105 } else if ( edge_weight[e] < heap.get(w) ) {
107 heap.decrease(w, edge_weight[e]);
113 for( G.first(f,v); G.valid(f); G.next(f)) {
119 heap.push(w, edge_weight[f]);
121 } else if ( edge_weight[f] < heap.get(w) ) {
123 heap.decrease(w, edge_weight[f]);
134 for ( G.first(u) ; G.valid(u) ; G.next(u) ) w+=min_weight[u];
147 for ( G.first(u) ; G.valid(u) ; G.next(u) )
156 bool reached(Node v) {