diff -r a9933b493198 -r d9a221218ea4 lemon/fredman_tarjan.h --- a/lemon/fredman_tarjan.h Fri Apr 14 15:05:51 2006 +0000 +++ b/lemon/fredman_tarjan.h Fri Apr 14 18:05:02 2006 +0000 @@ -211,9 +211,12 @@ private: - template - void processNextTree(const SrcGraph& graph,const OrigMap& orig,Heap &heap, - ProcessedMap& processed,PredMap& pred,int& tree_counter,const int limit){ + template + void processNextTree(const SrcGraph& graph,const OrigMap& orig, + Heap &heap, HeapCrossRef& crossref, + ProcessedMap& processed,PredMap& pred, + int& tree_counter,const int limit){ std::vector tree_nodes; int tree_index=tree_counter; bool stop=false; @@ -254,21 +257,23 @@ for(int i=1;i<(int)tree_nodes.size();++i){ _tree->set(orig[pred[tree_nodes[i]]],true); processed.set(tree_nodes[i],tree_index); - heap.state(tree_nodes[i], Heap::PRE_HEAP); + crossref[tree_nodes[i]] = Heap::PRE_HEAP; } processed.set(tree_nodes[0],tree_index); - heap.state(tree_nodes[0],Heap::PRE_HEAP); + crossref[tree_nodes[0]] = Heap::PRE_HEAP; while (!heap.empty()) { typename SrcGraph::Node v=heap.top(); heap.pop(); - heap.state(v,Heap::PRE_HEAP); + crossref[v] = Heap::PRE_HEAP; } + heap.clear(); if(!stop)++tree_counter; } template - void createTrees(const SrcGraph& graph,const OrigMap& orig, ProcessedMap& processed, - int edgenum,int& tree_counter){ + void createTrees(const SrcGraph& graph, const OrigMap& orig, + ProcessedMap& processed, + int edgenum,int& tree_counter){ typedef typename SrcGraph::Node Node; typedef typename SrcGraph::UEdge UEdge; typedef typename SrcGraph::NodeIt NodeIt; @@ -278,18 +283,22 @@ FibHeap heap(crossref); PredMap pred(graph,INVALID); int rate=2*edgenum/countNodes(graph); - int limit=(rate>std::numeric_limits::digits)?std::numeric_limits::max():(1<std::numeric_limits::digits)? + std::numeric_limits::max() : (1< - void collect(const SrcGraph& srcgraph,const SrcOrigMap& srcorig,DestGraph& destgraph, - DestOrigMap& destorig,const ProcessedMap& processed,const int tree_counter){ + template + void collect(const SrcGraph& srcgraph,const SrcOrigMap& srcorig, + DestGraph& destgraph,DestOrigMap& destorig, + const ProcessedMap& processed,const int tree_counter){ typedef typename SrcGraph::Node Node; typedef typename DestGraph::Node DNode; typedef typename SrcGraph::UEdge UEdge; @@ -310,14 +319,17 @@ } } - radixSort(edges.begin(),edges.end(),mapFunctor(composeMap(processed,sourceMap(srcgraph)))); - counterSort(edges.begin(),edges.end(),mapFunctor(composeMap(processed,targetMap(srcgraph)))); + radixSort(edges.begin(),edges.end(), + mapFunctor(composeMap(processed,sourceMap(srcgraph)))); + counterSort(edges.begin(),edges.end(), + mapFunctor(composeMap(processed,targetMap(srcgraph)))); for(int i=0;i!=(int)edges.size();++i){ int srcproc=processed[srcgraph.source(edges[i])]; int trgproc=processed[srcgraph.target(edges[i])]; Value minval=(*cost)[srcorig[edges[i]]]; UEdge minpos=edges[i]; - while (i+1!=(int)edges.size() && srcproc==processed[srcgraph.source(edges[i+1])] && + while (i+1!=(int)edges.size() && + srcproc==processed[srcgraph.source(edges[i+1])] && trgproc==processed[srcgraph.target(edges[i+1])]) { if (minval>(*cost)[srcorig[edges[i+1]]]) { minval=(*cost)[srcorig[edges[i+1]]]; @@ -325,7 +337,8 @@ } ++i; } - destorig[destgraph.addEdge(nodes[srcproc],nodes[trgproc])]=srcorig[minpos]; + destorig[destgraph.addEdge(nodes[srcproc],nodes[trgproc])]= + srcorig[minpos]; } }