Changeset 211:9222a9b8b323 in lemon-0.x for src/work/jacint
- Timestamp:
- 03/19/04 23:16:05 (21 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@306
- Location:
- src/work/jacint
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/work/jacint/dijkstra.cc
r173 r211 2 2 #include <fstream> 3 3 4 #include <list_graph.hh> 5 #include <dimacs.hh> 4 #include <smart_graph.h> 5 #include <list_graph.h> 6 #include <dimacs.h> 6 7 #include <dijkstra.h> 7 8 #include <time_measure.h> … … 13 14 14 15 int main(int, char **) { 15 typedef ListGraph::NodeIt NodeIt;16 typedef ListGraph::EachNodeIt EachNodeIt;17 typedef ListGraph::InEdgeIt InEdgeIt;16 typedef SmartGraph::Node Node; 17 typedef SmartGraph::NodeIt NodeIt; 18 typedef SmartGraph::InEdgeIt InEdgeIt; 18 19 19 ListGraph G;20 Node Its, t;21 ListGraph::EdgeMap<int> cap(G);20 SmartGraph G; 21 Node s, t; 22 SmartGraph::EdgeMap<int> cap(G); 22 23 readDimacsMaxFlow(std::cin, G, s, t, cap); 23 24 … … 25 26 26 27 double pre_time=currTime(); 27 Dijkstra< ListGraph, int, FibHeap<ListGraph::NodeIt, int,28 ListGraph::NodeMap<int> > > dijkstra_test(G, s, cap);29 dijkstra_test.run( );28 Dijkstra<SmartGraph, int, FibHeap<SmartGraph::Node, int, 29 SmartGraph::NodeMap<int> > > dijkstra_test(G, cap); 30 dijkstra_test.run(s); 30 31 double post_time=currTime(); 31 32 … … 34 35 35 36 pre_time=currTime(); 36 Dijkstra< ListGraph, int, BinHeap<ListGraph::NodeIt, int,37 ListGraph::NodeMap<int> > > dijkstra_test2(G, s, cap);38 dijkstra_test2.run( );37 Dijkstra<SmartGraph, int, BinHeap<SmartGraph::Node, int, 38 SmartGraph::NodeMap<int> > > dijkstra_test2(G, cap); 39 dijkstra_test2.run(s); 39 40 post_time=currTime(); 40 41 … … 45 46 int hiba_fib=0; 46 47 int hiba_bin=0; 47 EachNodeIt u;48 for ( G. getFirst(u) ; G.valid(u); G.next(u) ) {48 NodeIt u; 49 for ( G.first(u) ; G.valid(u); G.next(u) ) { 49 50 InEdgeIt e; 50 for ( G. getFirst(e,u); G.valid(e); G.next(e) ) {51 Node Itv=G.tail(e);51 for ( G.first(e,u); G.valid(e); G.next(e) ) { 52 Node v=G.tail(e); 52 53 if ( dijkstra_test.dist(u) - dijkstra_test.dist(v) > cap.get(e) ) 53 54 { … … 88 89 std::cout << "Hibas elek szama a fibonaccis Dijkstraban: " 89 90 << hiba_fib << " a " << G.edgeNum() <<"-bol."<< std::endl; 90 91 91 92 std::cout << "Hibas elek szama a binarisos Dijkstraban: " 92 93 << hiba_bin << " a " << G.edgeNum() <<"-bol."<< std::endl; 93 94 94 95 95 96 -
src/work/jacint/dijkstra.h
r171 r211 1 1 // -*- C++ -*- 2 3 //ha predecessor az elejen nem invalid, akkor hagyd csak ugy4 //scanned mutatja hogy jo ertek van-e benne vagy szemet5 6 2 /* 7 *template <Graph, T, Heap=FibHeap >3 *template <Graph, T, Heap=FibHeap, LengthMap=Graph::EdgeMap<T> > 8 4 * 9 5 *Constructor: 10 6 * 11 *Dijkstra(Graph G, NodeIt s, Graph::EdgeMap<T>length)7 *Dijkstra(Graph G, LengthMap length) 12 8 * 13 9 * 14 *Me mber functions:10 *Methods: 15 11 * 16 *void run( )12 *void run(Node s) 17 13 * 18 * The following function should be used after run() was already run. 14 *T dist(Node v) : After run(s) was run, it returns the distance from s to v. 15 * Returns T() if v is not reachable from s. 19 16 * 20 *T dist(NodeIt v) : returns the distance from s to v. 21 * It is 0 if v is not reachable from s. 17 *Edge pred(Node v) : After run(s) was run, it returns the last 18 * edge of a shortest s-v path. It is INVALID for s and for 19 * the nodes not reachable from s. 22 20 * 23 *EdgeIt pred(NodeIt v) : returns the last edge 24 * of a shortest s-v path. Returns an invalid iterator 25 * if v=s or v is not reachable from s. 26 * 27 *bool reach(NodeIt v) : true iff v is reachable from s 21 *bool reached(Node v) : After run(s) was run, it is true iff v is 22 * reachable from s 28 23 * 29 24 */ 30 25 31 #ifndef DIJKSTRA_H32 #define DIJKSTRA_H26 #ifndef HUGO_DIJKSTRA_H 27 #define HUGO_DIJKSTRA_H 33 28 34 29 #include <fib_heap.h> 30 #include <invalid.h> 35 31 36 32 namespace hugo { 37 33 38 34 template <typename Graph, typename T, 39 typename Heap=FibHeap<typename Graph::NodeIt, T, 40 typename Graph::NodeMap<int> > > 41 class Dijkstra{ 42 typedef typename Graph::NodeIt NodeIt; 43 typedef typename Graph::EdgeIt EdgeIt; 44 typedef typename Graph::OutEdgeIt OutEdgeIt; 45 46 Graph& G; 47 NodeIt s; 48 typename Graph::NodeMap<EdgeIt> predecessor; 49 typename Graph::NodeMap<T> distance; 50 typename Graph::EdgeMap<T>& length; 51 typename Graph::NodeMap<bool> reached; 52 35 typename Heap=FibHeap<typename Graph::Node, T, 36 typename Graph::NodeMap<int> >, 37 typename LengthMap=typename Graph::EdgeMap<T> > 38 class Dijkstra{ 39 typedef typename Graph::Node Node; 40 typedef typename Graph::NodeIt NodeIt; 41 typedef typename Graph::Edge Edge; 42 typedef typename Graph::OutEdgeIt OutEdgeIt; 43 44 const Graph& G; 45 const LengthMap& length; 46 typename Graph::NodeMap<Edge> predecessor; 47 typename Graph::NodeMap<T> distance; 48 typename Graph::NodeMap<bool> reach; 49 53 50 public : 54 51 55 52 /* 56 53 The distance of the nodes is 0. 57 54 */ 58 Dijkstra(Graph& _G, NodeIt const _s, 59 typename Graph::EdgeMap<T>& _length) : 60 G(_G), s(_s), predecessor(G), distance(G), 61 length(_length), reached(G, false) { } 55 Dijkstra(Graph& _G, LengthMap& _length) : G(_G), 56 length(_length), predecessor(_G), distance(_G), reach(_G) { } 62 57 58 59 void run(Node s) { 63 60 64 void run() { 61 NodeIt u; 62 for ( G.first(u) ; G.valid(u) ; G.next(u) ) { 63 predecessor.set(u,INVALID); 64 distance.set(u,0); 65 reach.set(u,false); 66 } 67 68 typename Graph::NodeMap<bool> scanned(G,false); 69 typename Graph::NodeMap<int> heap_map(G,-1); 70 71 Heap heap(heap_map); 72 73 heap.push(s,0); 74 reach.set(s, true); 75 76 while ( !heap.empty() ) { 65 77 66 typename Graph::NodeMap<bool> scanned(G, false); 67 typename Graph::NodeMap<int> heap_map(G,-1); 78 Node v=heap.top(); 79 T oldvalue=heap.get(v); 80 heap.pop(); 81 distance.set(v, oldvalue); 82 scanned.set(v,true); 68 83 69 Heap heap(heap_map); 70 71 heap.push(s,0); 72 reached.set(s, true); 73 74 while ( !heap.empty() ) { 75 76 NodeIt v=heap.top(); 77 T oldvalue=heap.get(v); 78 heap.pop(); 79 distance.set(v, oldvalue); 80 scanned.set(v,true); 81 82 OutEdgeIt e; 83 for( G.getFirst(e,v); G.valid(e); G.next(e)) { 84 NodeIt w=G.bNode(e); 84 OutEdgeIt e; 85 for( G.first(e,v); G.valid(e); G.next(e)) { 86 Node w=G.head(e); 85 87 86 if ( !scanned.get(w) ) { 87 if ( !reached.get(w) ) { 88 reached.set(w,true); 89 heap.push(w,oldvalue+length.get(e)); 90 predecessor.set(w,e); 91 } else if ( oldvalue+length.get(e) < heap.get(w) ) { 92 predecessor.set(w,e); 93 heap.decrease(w, oldvalue+length.get(e)); 94 } 88 if ( !scanned[w] ) { 89 if ( !reach[w] ) { 90 reach.set(w,true); 91 heap.push(w,oldvalue+length[e]); 92 predecessor.set(w,e); 93 } else if ( oldvalue+length[e] < heap.get(w) ) { 94 predecessor.set(w,e); 95 heap.decrease(w, oldvalue+length[e]); 95 96 } 96 97 } 97 98 } 98 } 99 99 } 100 } 101 100 102 101 T dist(NodeItv) {102 return distance.get(v);103 103 T dist(Node v) { 104 return distance[v]; 105 } 104 106 105 107 106 EdgeIt pred(NodeIt v) { 107 if ( v!=s ) return predecessor.get(v); 108 else return EdgeIt(); 109 } 108 Edge pred(Node v) { 109 return predecessor[v]; 110 } 110 111 111 112 112 bool reach(NodeItv) {113 return reached.get(v);114 115 116 113 bool reached(Node v) { 114 return reach[v]; 115 } 116 117 }; 117 118 118 119 } -
src/work/jacint/fib_heap.h
r173 r211 144 144 145 145 146 147 148 PrioType& operator[](const Item& it) const { 149 return container[iimap.get(it)].prio; 150 } 151 152 const PrioType& operator[](const Item& it) const { 153 return container[iimap.get(it)].prio; 154 } 155 146 156 const PrioType get(const Item& it) const { 147 157 return container[iimap.get(it)].prio; 148 158 } 159 149 160 150 161 -
src/work/jacint/makefile
r200 r211 2 2 CXX2 = g++-2.95 3 3 CXXFLAGS = -W -Wall -ansi -pedantic 4 LEDAROOT = /ledasrc/LEDA-4.14 LEDAROOT ?= /ledasrc/LEDA-4.1 5 5 6 BINARIES = preflow dijkstra prim6 BINARIES = dijkstra prim preflow 7 7 8 8 all: $(BINARIES) … … 12 12 13 13 preflow: 14 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci - o preflow preflow.cc14 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci -I../alpar -o preflow preflow.cc 15 15 16 16 dijkstra: 17 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci - o dijkstra dijkstra.cc17 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci -I../alpar -o dijkstra dijkstra.cc 18 18 19 19 prim: 20 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci - o prim prim.cc20 $(CXX3) $(CXXFLAGS) -O3 -I. -I.. -I../marci -I../alpar -o prim prim.cc 21 21 22 22 clean: -
src/work/jacint/preflow.cc
r113 r211 2 2 #include <fstream> 3 3 4 #include <list_graph.h h>5 #include <dimacs.h h>4 #include <list_graph.h> 5 #include <dimacs.h> 6 6 #include <preflow.h> 7 7 #include <time_measure.h> … … 12 12 // read_dimacs_demo < dimacs_max_flow_file 13 13 int main(int, char **) { 14 typedef ListGraph::Node It NodeIt;15 typedef ListGraph::E achEdgeIt EachEdgeIt;14 typedef ListGraph::Node Node; 15 typedef ListGraph::EdgeIt EdgeIt; 16 16 17 17 ListGraph G; 18 Node Its, t;18 Node s, t; 19 19 ListGraph::EdgeMap<int> cap(G); 20 20 readDimacsMaxFlow(std::cin, G, s, t, cap); … … 25 25 26 26 for ( int i=1; i!=11; ++i ) { 27 ListGraph::EdgeMap<int> flow(G); 27 28 double pre_time=currTime(); 28 preflow<ListGraph, int> max_flow_test(G, s, t, cap); 29 Preflow<ListGraph, int> max_flow_test(G, s, t, cap, flow); 30 max_flow_test.run(); 29 31 double post_time=currTime(); 30 32 if ( mintime > post_time-pre_time ) mintime = post_time-pre_time; 31 33 } 32 34 33 double pre_time=currTime();34 preflow<ListGraph, int> max_flow_test(G, s, t, cap);35 double post_time=currTime();36 35 ListGraph::EdgeMap<int> flow(G); 36 Preflow<ListGraph, int> max_flow_test(G, s, t, cap, flow); 37 max_flow_test.run(); 38 37 39 ListGraph::NodeMap<bool> cut(G); 38 40 max_flow_test.minCut(cut); 39 41 int min_cut_value=0; 40 for(EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) { 42 EdgeIt e; 43 for(G.first(e); G.valid(e); G.next(e)) { 41 44 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) min_cut_value+=cap.get(e); 42 45 } … … 45 48 max_flow_test.minMinCut(cut1); 46 49 int min_min_cut_value=0; 47 for( EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) {50 for(G.first(e); G.valid(e); G.next(e)) { 48 51 if (cut.get(G.tail(e)) && !cut.get(G.head(e))) 49 52 min_min_cut_value+=cap.get(e); … … 53 56 max_flow_test.maxMinCut(cut2); 54 57 int max_min_cut_value=0; 55 for( EachEdgeIt e=G.first<EachEdgeIt>(); e.valid(); ++e) {58 for(G.first(e); G.valid(e); G.next(e)) { 56 59 if (cut2.get(G.tail(e)) && !cut2.get(G.head(e))) 57 60 max_min_cut_value+=cap.get(e); … … 59 62 60 63 std::cout << "min time of 10 runs: " << mintime << " sec"<< std::endl; 61 std::cout << "phase 0: " << max_flow_test.time-pre_time 62 << " sec"<< std::endl; 63 std::cout << "phase 1: " << post_time-max_flow_test.time 64 << " sec"<< std::endl; 65 std::cout << "flow value: "<< max_flow_test.maxFlow() << std::endl; 64 std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; 66 65 std::cout << "min cut value: "<< min_cut_value << std::endl; 67 66 std::cout << "min min cut value: "<< min_min_cut_value << std::endl; -
src/work/jacint/preflow.h
r174 r211 1 1 // -*- C++ -*- 2 2 /* 3 preflow.h4 by jacint.5 3 Heuristics: 6 4 2 phase … … 13 11 Parameters H0 and H1 are initialized to 20 and 10. 14 12 15 The best preflow I could ever write. 16 17 The constructor runs the algorithm. 13 Constructors: 14 15 Preflow(Graph, Node, Node, CapMap, FlowMap) 18 16 19 17 Members: 20 18 21 T maxFlow() : returns the value of a maximum flow 22 23 T flowOnEdge(EdgeIt e) : for a fixed maximum flow x it returns x(e) 24 25 FlowMap Flow() : returns the fixed maximum flow x 19 void run() 20 21 T flowValue() : returns the value of a maximum flow 26 22 27 23 void minMinCut(CutMap& M) : sets M to the characteristic vector of the … … 36 32 */ 37 33 38 #ifndef PREFLOW_H39 #define PREFLOW_H34 #ifndef HUGO_PREFLOW_H 35 #define HUGO_PREFLOW_H 40 36 41 37 #define H0 20 … … 44 40 #include <vector> 45 41 #include <queue> 46 47 #include <time_measure.h>48 42 49 43 namespace hugo { … … 52 46 typename FlowMap=typename Graph::EdgeMap<T>, 53 47 typename CapMap=typename Graph::EdgeMap<T> > 54 class preflow {48 class Preflow { 55 49 50 typedef typename Graph::Node Node; 51 typedef typename Graph::Edge Edge; 56 52 typedef typename Graph::NodeIt NodeIt; 57 typedef typename Graph::EdgeIt EdgeIt;58 typedef typename Graph::EachNodeIt EachNodeIt;59 53 typedef typename Graph::OutEdgeIt OutEdgeIt; 60 54 typedef typename Graph::InEdgeIt InEdgeIt; 61 55 62 Graph& G;63 Node Its;64 Node Itt;65 FlowMap flow;66 CapMap& capacity;56 const Graph& G; 57 Node s; 58 Node t; 59 FlowMap& flow; 60 const CapMap& capacity; 67 61 T value; 68 62 69 63 public: 70 double time; 71 preflow(Graph& _G, NodeIt _s, NodeIt _t, CapMap& _capacity ) : 72 G(_G), s(_s), t(_t), flow(_G, 0), capacity(_capacity) 73 { 64 Preflow(Graph& _G, Node _s, Node _t, CapMap& _capacity, FlowMap& _flow ) : 65 G(_G), s(_s), t(_t), flow(_flow), capacity(_capacity) {} 66 67 68 void run() { 74 69 75 70 bool phase=0; //phase 0 is the 1st phase, phase 1 is the 2nd … … 95 90 typename Graph::NodeMap<T> excess(G); 96 91 97 std::vector<Node It> active(n);98 typename Graph::NodeMap<Node It> next(G);92 std::vector<Node> active(n,INVALID); 93 typename Graph::NodeMap<Node> next(G,INVALID); 99 94 //Stack of the active nodes in level i < n. 100 95 //We use it in both phases. 101 96 102 typename Graph::NodeMap<Node It> left(G);103 typename Graph::NodeMap<Node It> right(G);104 std::vector<Node It> level_list(n);97 typename Graph::NodeMap<Node> left(G,INVALID); 98 typename Graph::NodeMap<Node> right(G,INVALID); 99 std::vector<Node> level_list(n,INVALID); 105 100 /* 106 101 List of the nodes in level i<n. … … 109 104 /*Reverse_bfs from t, to find the starting level.*/ 110 105 level.set(t,0); 111 std::queue<Node It> bfs_queue;106 std::queue<Node> bfs_queue; 112 107 bfs_queue.push(t); 113 108 114 109 while (!bfs_queue.empty()) { 115 110 116 Node Itv=bfs_queue.front();111 Node v=bfs_queue.front(); 117 112 bfs_queue.pop(); 118 int l=level.get(v)+1; 119 120 for(InEdgeIt e=G.template first<InEdgeIt>(v); e.valid(); ++e) { 121 NodeIt w=G.tail(e); 122 if ( level.get(w) == n && w != s ) { 113 int l=level[v]+1; 114 115 InEdgeIt e; 116 for(G.first(e,v); G.valid(e); G.next(e)) { 117 Node w=G.tail(e); 118 if ( level[w] == n && w != s ) { 123 119 bfs_queue.push(w); 124 Node Itfirst=level_list[l];125 if ( first != 0) left.set(first,w);120 Node first=level_list[l]; 121 if ( G.valid(first) ) left.set(first,w); 126 122 right.set(w,first); 127 123 level_list[l]=w; … … 135 131 136 132 /* Starting flow. It is everywhere 0 at the moment. */ 137 for(OutEdgeIt e=G.template first<OutEdgeIt>(s); e.valid(); ++e) 133 OutEdgeIt e; 134 for(G.first(e,s); G.valid(e); G.next(e)) 138 135 { 139 T c=capacity .get(e);136 T c=capacity[e]; 140 137 if ( c == 0 ) continue; 141 Node Itw=G.head(e);142 if ( level .get(w)< n ) {143 if ( excess .get(w)== 0 && w!=t ) {144 next.set(w,active[level .get(w)]);145 active[level .get(w)]=w;138 Node w=G.head(e); 139 if ( level[w] < n ) { 140 if ( excess[w] == 0 && w!=t ) { 141 next.set(w,active[level[w]]); 142 active[level[w]]=w; 146 143 } 147 144 flow.set(e, c); 148 excess.set(w, excess .get(w)+c);145 excess.set(w, excess[w]+c); 149 146 } 150 147 } … … 169 166 } else { 170 167 phase=1; 171 time=currTime();172 168 level.set(s,0); 173 std::queue<Node It> bfs_queue;169 std::queue<Node> bfs_queue; 174 170 bfs_queue.push(s); 175 171 176 172 while (!bfs_queue.empty()) { 177 173 178 Node Itv=bfs_queue.front();174 Node v=bfs_queue.front(); 179 175 bfs_queue.pop(); 180 int l=level.get(v)+1; 181 182 for(InEdgeIt e=G.template first<InEdgeIt>(v); e.valid(); ++e) { 183 if ( capacity.get(e) == flow.get(e) ) continue; 184 NodeIt u=G.tail(e); 185 if ( level.get(u) >= n ) { 176 int l=level[v]+1; 177 178 InEdgeIt e; 179 for(G.first(e,v); G.valid(e); G.next(e)) { 180 if ( capacity[e] == flow[e] ) continue; 181 Node u=G.tail(e); 182 if ( level[u] >= n ) { 186 183 bfs_queue.push(u); 187 184 level.set(u, l); 188 if ( excess .get(u)> 0 ) {185 if ( excess[u] > 0 ) { 189 186 next.set(u,active[l]); 190 187 active[l]=u; … … 193 190 } 194 191 195 for(OutEdgeIt e=G.template first<OutEdgeIt>(v); e.valid(); ++e) { 196 if ( 0 == flow.get(e) ) continue; 197 NodeIt u=G.head(e); 198 if ( level.get(u) >= n ) { 192 OutEdgeIt f; 193 for(G.first(f,v); G.valid(f); G.next(f)) { 194 if ( 0 == flow[f] ) continue; 195 Node u=G.head(f); 196 if ( level[u] >= n ) { 199 197 bfs_queue.push(u); 200 198 level.set(u, l); 201 if ( excess .get(u)> 0 ) {199 if ( excess[u] > 0 ) { 202 200 next.set(u,active[l]); 203 201 active[l]=u; … … 212 210 213 211 214 if ( active[b] == 0) --b;212 if ( !G.valid(active[b]) ) --b; 215 213 else { 216 214 end=false; 217 215 218 Node Itw=active[b];219 active[b]=next .get(w);220 int lev=level .get(w);221 T exc=excess .get(w);216 Node w=active[b]; 217 active[b]=next[w]; 218 int lev=level[w]; 219 T exc=excess[w]; 222 220 int newlevel=n; //bound on the next level of w 223 221 224 for(OutEdgeIt e=G.template first<OutEdgeIt>(w); e.valid(); ++e) { 225 226 if ( flow.get(e) == capacity.get(e) ) continue; 227 NodeIt v=G.head(e); 222 OutEdgeIt e; 223 for(G.first(e,w); G.valid(e); G.next(e)) { 224 225 if ( flow[e] == capacity[e] ) continue; 226 Node v=G.head(e); 228 227 //e=wv 229 228 230 if( lev > level .get(v)) {229 if( lev > level[v] ) { 231 230 /*Push is allowed now*/ 232 231 233 if ( excess .get(v)==0 && v!=t && v!=s ) {234 int lev_v=level .get(v);232 if ( excess[v]==0 && v!=t && v!=s ) { 233 int lev_v=level[v]; 235 234 next.set(v,active[lev_v]); 236 235 active[lev_v]=v; 237 236 } 238 237 239 T cap=capacity .get(e);240 T flo=flow .get(e);238 T cap=capacity[e]; 239 T flo=flow[e]; 241 240 T remcap=cap-flo; 242 241 … … 245 244 246 245 flow.set(e, flo+exc); 247 excess.set(v, excess .get(v)+exc);246 excess.set(v, excess[v]+exc); 248 247 exc=0; 249 248 break; … … 253 252 254 253 flow.set(e, cap); 255 excess.set(v, excess .get(v)+remcap);254 excess.set(v, excess[v]+remcap); 256 255 exc-=remcap; 257 256 } 258 } else if ( newlevel > level .get(v)){259 newlevel = level .get(v);257 } else if ( newlevel > level[v] ){ 258 newlevel = level[v]; 260 259 } 261 260 … … 264 263 265 264 if ( exc > 0 ) { 266 for( InEdgeIt e=G.template first<InEdgeIt>(w); e.valid(); ++e) { 267 268 if( flow.get(e) == 0 ) continue; 269 NodeIt v=G.tail(e); 265 InEdgeIt e; 266 for(G.first(e,w); G.valid(e); G.next(e)) { 267 268 if( flow[e] == 0 ) continue; 269 Node v=G.tail(e); 270 270 //e=vw 271 271 272 if( lev > level .get(v)) {272 if( lev > level[v] ) { 273 273 /*Push is allowed now*/ 274 274 275 if ( excess .get(v)==0 && v!=t && v!=s ) {276 int lev_v=level .get(v);275 if ( excess[v]==0 && v!=t && v!=s ) { 276 int lev_v=level[v]; 277 277 next.set(v,active[lev_v]); 278 278 active[lev_v]=v; 279 279 } 280 280 281 T flo=flow .get(e);281 T flo=flow[e]; 282 282 283 283 if ( flo >= exc ) { … … 285 285 286 286 flow.set(e, flo-exc); 287 excess.set(v, excess .get(v)+exc);287 excess.set(v, excess[v]+exc); 288 288 exc=0; 289 289 break; … … 291 291 /*A saturating push.*/ 292 292 293 excess.set(v, excess .get(v)+flo);293 excess.set(v, excess[v]+flo); 294 294 exc-=flo; 295 295 flow.set(e,0); 296 296 } 297 } else if ( newlevel > level .get(v)) {298 newlevel = level .get(v);297 } else if ( newlevel > level[v] ) { 298 newlevel = level[v]; 299 299 } 300 300 } //for in edges vw … … 319 319 } else { 320 320 //unlacing starts 321 Node It right_n=right.get(w);322 Node It left_n=left.get(w);323 324 if ( right_n != 0) {325 if ( left_n != 0) {321 Node right_n=right[w]; 322 Node left_n=left[w]; 323 324 if ( G.valid(right_n) ) { 325 if ( G.valid(left_n) ) { 326 326 right.set(left_n, right_n); 327 327 left.set(right_n, left_n); 328 328 } else { 329 329 level_list[lev]=right_n; 330 left.set(right_n, 0);330 left.set(right_n, INVALID); 331 331 } 332 332 } else { 333 if ( left_n != 0) {334 right.set(left_n, 0);333 if ( G.valid(left_n) ) { 334 right.set(left_n, INVALID); 335 335 } else { 336 level_list[lev]=0; 337 336 level_list[lev]=INVALID; 338 337 } 339 338 } … … 341 340 342 341 //gapping starts 343 if ( level_list[lev]==0) {342 if ( !G.valid(level_list[lev]) ) { 344 343 345 344 for (int i=lev; i!=k ; ) { 346 Node Itv=level_list[++i];347 while ( v != 0) {345 Node v=level_list[++i]; 346 while ( G.valid(v) ) { 348 347 level.set(v,n); 349 v=right .get(v);348 v=right[v]; 350 349 } 351 level_list[i]= 0;352 if ( !what_heur ) active[i]= 0;350 level_list[i]=INVALID; 351 if ( !what_heur ) active[i]=INVALID; 353 352 } 354 353 … … 366 365 if ( what_heur ) b=newlevel; 367 366 if ( k < newlevel ) ++k; 368 Node Itfirst=level_list[newlevel];369 if ( first != 0) left.set(first,w);367 Node first=level_list[newlevel]; 368 if ( G.valid(first) ) left.set(first,w); 370 369 right.set(w,first); 371 left.set(w, 0);370 left.set(w,INVALID); 372 371 level_list[newlevel]=w; 373 372 } … … 399 398 400 399 401 value = excess .get(t);400 value = excess[t]; 402 401 /*Max flow value.*/ 403 402 … … 412 411 */ 413 412 414 T maxFlow() {413 T flowValue() { 415 414 return value; 416 415 } 417 418 419 420 /*421 For the maximum flow x found by the algorithm,422 it returns the flow value on edge e, i.e. x(e).423 */424 425 T flowOnEdge(EdgeIt e) {426 return flow.get(e);427 }428 429 416 430 417 … … 436 423 437 424 void Flow(FlowMap& _flow ) { 438 for(EachNodeIt v=G.template first<EachNodeIt>() ; v.valid(); ++v) 439 _flow.set(v,flow.get(v)); 440 } 425 NodeIt v; 426 for(G.first(v) ; G.valid(v); G.next(v)) 427 _flow.set(v,flow[v]); 428 } 441 429 442 430 … … 449 437 void minMinCut(_CutMap& M) { 450 438 451 std::queue<Node It> queue;439 std::queue<Node> queue; 452 440 453 441 M.set(s,true); … … 455 443 456 444 while (!queue.empty()) { 457 Node Itw=queue.front();445 Node w=queue.front(); 458 446 queue.pop(); 459 447 460 for(OutEdgeIt e=G.template first<OutEdgeIt>(w) ; e.valid(); ++e) { 461 NodeIt v=G.head(e); 462 if (!M.get(v) && flow.get(e) < capacity.get(e) ) { 448 OutEdgeIt e; 449 for(G.first(e,w) ; G.valid(e); G.next(e)) { 450 Node v=G.head(e); 451 if (!M[v] && flow[e] < capacity[e] ) { 463 452 queue.push(v); 464 453 M.set(v, true); … … 466 455 } 467 456 468 for(InEdgeIt e=G.template first<InEdgeIt>(w) ; e.valid(); ++e) { 469 NodeIt v=G.tail(e); 470 if (!M.get(v) && flow.get(e) > 0 ) { 457 InEdgeIt f; 458 for(G.first(f,w) ; G.valid(f); G.next(f)) { 459 Node v=G.tail(f); 460 if (!M[v] && flow[f] > 0 ) { 471 461 queue.push(v); 472 462 M.set(v, true); … … 486 476 void maxMinCut(_CutMap& M) { 487 477 488 std::queue<Node It> queue;478 std::queue<Node> queue; 489 479 490 480 M.set(t,true); … … 492 482 493 483 while (!queue.empty()) { 494 Node Itw=queue.front();484 Node w=queue.front(); 495 485 queue.pop(); 496 486 497 for(InEdgeIt e=G.template first<InEdgeIt>(w) ; e.valid(); ++e) { 498 NodeIt v=G.tail(e); 499 if (!M.get(v) && flow.get(e) < capacity.get(e) ) { 487 488 InEdgeIt e; 489 for(G.first(e,w) ; G.valid(e); G.next(e)) { 490 Node v=G.tail(e); 491 if (!M[v] && flow[e] < capacity[e] ) { 500 492 queue.push(v); 501 493 M.set(v, true); 502 494 } 503 495 } 504 505 for(OutEdgeIt e=G.template first<OutEdgeIt>(w) ; e.valid(); ++e) { 506 NodeIt v=G.head(e); 507 if (!M.get(v) && flow.get(e) > 0 ) { 496 497 OutEdgeIt f; 498 for(G.first(f,w) ; G.valid(f); G.next(f)) { 499 Node v=G.head(f); 500 if (!M[v] && flow[f] > 0 ) { 508 501 queue.push(v); 509 502 M.set(v, true); … … 512 505 } 513 506 514 for(EachNodeIt v=G.template first<EachNodeIt>() ; v.valid(); ++v) { 515 M.set(v, !M.get(v)); 507 NodeIt v; 508 for(G.first(v) ; G.valid(v); G.next(v)) { 509 M.set(v, !M[v]); 516 510 } 517 511 -
src/work/jacint/prim.cc
r173 r211 2 2 #include <fstream> 3 3 4 #include <list_graph.h h>5 #include <dimacs.h h>4 #include <list_graph.h> 5 #include <dimacs.h> 6 6 #include <prim.h> 7 7 #include <time_measure.h> … … 13 13 14 14 int main(int, char **) { 15 typedef ListGraph::Node It NodeIt;15 typedef ListGraph::Node Node; 16 16 17 17 ListGraph G; 18 Node Its, t;18 Node s, t; 19 19 ListGraph::EdgeMap<int> cap(G); 20 20 readDimacsMaxFlow(std::cin, G, s, t, cap); … … 23 23 24 24 double pre_time=currTime(); 25 Prim<ListGraph, int, FibHeap<ListGraph::Node It, int,25 Prim<ListGraph, int, FibHeap<ListGraph::Node, int, 26 26 ListGraph::NodeMap<int> > > prim_test(G, cap); 27 27 prim_test.run(); … … 32 32 33 33 pre_time=currTime(); 34 Prim<ListGraph, int, BinHeap<ListGraph::Node It, int,34 Prim<ListGraph, int, BinHeap<ListGraph::Node, int, 35 35 ListGraph::NodeMap<int> > > prim_test2(G, cap); 36 36 prim_test2.run(); -
src/work/jacint/prim.h
r173 r211 1 1 // -*- C++ -*- 2 3 //kell hogy tree_edge invalid elekbol alljon, Szep4 //lenne ha az elejen a konstrualas ilyet adna, de5 //ugy fest nem igy lesz, ekkor invalidalni kell6 7 2 /* 8 *template <Graph, T, Heap=FibHeap >3 *template <Graph, T, Heap=FibHeap, LengthMap=Graph::EdgeMap<T> > 9 4 * 10 5 *Constructor: 11 6 * 12 *Prim(Graph G, Graph::EdgeMap<T> weight, NodeIt root=[G.first()])7 *Prim(Graph G, LengthMap weight) 13 8 * 14 9 * 15 10 *Methods: 16 11 * 17 *void run() 12 *void run() : Runs the Prim-algorithm from a random node 18 13 * 19 * The followings functions should be used after run() was already run.14 *void run(Node r) : Runs the Prim-algorithm from node s 20 15 * 21 *T weight() : returns the minimum weight of a spanning tree of the22 * component of the root.16 *T weight() : After run(r) was run, it returns the minimum 17 * weight of a spanning tree of the component of the root. 23 18 * 24 *Edge It tree(NodeIt v) : returns the first edge in the path from v25 * to the root. Returns an invalid iterator if v=s or v is26 * not reachable from 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. 27 22 * 28 *bool conn() : true iff G is connected23 *bool conn() : After run(r) was run, it is true iff G is connected 29 24 * 30 *bool reach(NodeIt v) : true iff v is in the same component as the root 25 *bool reached(Node v) : After run(r) was run, it is true 26 * iff v is in the same component as the root 31 27 * 32 *Node Itroot() : returns the root28 *Node root() : returns the root 33 29 * 34 30 */ 35 31 36 #ifndef PRIM_H37 #define PRIM_H32 #ifndef HUGO_PRIM_H 33 #define HUGO_PRIM_H 38 34 39 35 #include <fib_heap.h> 40 41 #include <iostream> 36 #include <invalid.h> 42 37 43 38 namespace hugo { 44 39 45 40 template <typename Graph, typename T, 46 typename Heap=FibHeap<typename Graph::NodeIt, T, 47 typename Graph::NodeMap<int> > > 41 typename Heap=FibHeap<typename Graph::Node, T, 42 typename Graph::NodeMap<int> >, 43 typename LengthMap=typename Graph::EdgeMap<T> > 48 44 class Prim{ 45 typedef typename Graph::Node Node; 49 46 typedef typename Graph::NodeIt NodeIt; 50 typedef typename Graph::EachNodeIt EachNodeIt; 51 typedef typename Graph::EdgeIt EdgeIt; 47 typedef typename Graph::Edge Edge; 52 48 typedef typename Graph::OutEdgeIt OutEdgeIt; 53 49 typedef typename Graph::InEdgeIt InEdgeIt; 54 50 55 Graph& G;56 NodeIt r;57 typename Graph::NodeMap<Edge It> tree_edge;51 const Graph& G; 52 const LengthMap& edge_weight; 53 typename Graph::NodeMap<Edge> tree_edge; 58 54 typename Graph::NodeMap<T> min_weight; 59 typename Graph::EdgeMap<T>& edge_weight; 60 typename Graph::NodeMap<bool> reached; 55 typename Graph::NodeMap<bool> reach; 61 56 62 57 public : 63 58 64 Prim(Graph& _G, typename Graph::EdgeMap<T>& _edge_weight, 65 NodeIt const _r) : 66 G(_G), r(_r), tree_edge(G), min_weight(G), 67 edge_weight(_edge_weight), reached(G, false) { } 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) { } 68 62 69 Prim(Graph& _G, typename Graph::EdgeMap<T>& _edge_weight) : 70 G(_G), tree_edge(G), min_weight(G), edge_weight(_edge_weight), reached(G, false) 71 { 72 EachNodeIt _r; //FIXME 73 G.getFirst(_r); 74 r=_r; 63 64 void run() { 65 NodeIt _r; 66 G.first(_r); 67 run(_r); 75 68 } 76 69 77 70 78 void run() { 71 void run(Node r) { 72 73 NodeIt u; 74 for ( G.first(u) ; G.valid(u) ; G.next(u) ) { 75 tree_edge.set(u,INVALID); 76 min_weight.set(u,0); 77 reach.set(u,false); 78 } 79 79 80 80 81 typename Graph::NodeMap<bool> scanned(G, false); … … 84 85 85 86 heap.push(r,0); 86 reach ed.set(r, true);87 reach.set(r, true); 87 88 88 89 while ( !heap.empty() ) { 89 90 90 Node Itv=heap.top();91 Node v=heap.top(); 91 92 min_weight.set(v, heap.get(v)); 92 93 heap.pop(); … … 94 95 95 96 OutEdgeIt e; 96 for( G. getFirst(e,v); G.valid(e); G.next(e)) {97 Node Itw=G.head(e);97 for( G.first(e,v); G.valid(e); G.next(e)) { 98 Node w=G.head(e); 98 99 99 if ( !scanned .get(w)) {100 if ( !reach ed.get(w)) {101 reach ed.set(w,true);102 heap.push(w, edge_weight .get(e));100 if ( !scanned[w] ) { 101 if ( !reach[w] ) { 102 reach.set(w,true); 103 heap.push(w, edge_weight[e]); 103 104 tree_edge.set(w,e); 104 } else if ( edge_weight .get(e)< heap.get(w) ) {105 } else if ( edge_weight[e] < heap.get(w) ) { 105 106 tree_edge.set(w,e); 106 heap.decrease(w, edge_weight .get(e));107 heap.decrease(w, edge_weight[e]); 107 108 } 108 109 } … … 110 111 111 112 InEdgeIt f; 112 for( G. getFirst(f,v); G.valid(f); G.next(f)) {113 Node Itw=G.tail(f);113 for( G.first(f,v); G.valid(f); G.next(f)) { 114 Node w=G.tail(f); 114 115 115 if ( !scanned .get(w)) {116 if ( !reach ed.get(w)) {117 reach ed.set(w,true);118 heap.push(w, edge_weight .get(f));116 if ( !scanned[w] ) { 117 if ( !reach[w] ) { 118 reach.set(w,true); 119 heap.push(w, edge_weight[f]); 119 120 tree_edge.set(w,f); 120 } else if ( edge_weight .get(f)< heap.get(w) ) {121 } else if ( edge_weight[f] < heap.get(w) ) { 121 122 tree_edge.set(w,f); 122 heap.decrease(w, edge_weight .get(f));123 heap.decrease(w, edge_weight[f]); 123 124 } 124 125 } … … 130 131 T weight() { 131 132 T w=0; 132 EachNodeIt u;133 for ( G. getFirst(u) ; G.valid(u) ; G.next(u) ) w+=min_weight.get(u);133 NodeIt u; 134 for ( G.first(u) ; G.valid(u) ; G.next(u) ) w+=min_weight[u]; 134 135 return w; 135 136 } 136 137 137 138 138 Edge It tree(NodeItv) {139 return tree_edge .get(v);139 Edge tree(Node v) { 140 return tree_edge[v]; 140 141 } 141 142 … … 143 144 bool conn() { 144 145 bool c=true; 145 EachNodeIt u;146 for ( G. getFirst(u) ; G.valid(u) ; G.next(u) )147 if ( !reached .get(u)) {146 NodeIt u; 147 for ( G.first(u) ; G.valid(u) ; G.next(u) ) 148 if ( !reached[u] ) { 148 149 c=false; 149 150 break; … … 153 154 154 155 155 bool reach (NodeItv) {156 return reached .get(v);156 bool reached(Node v) { 157 return reached[v]; 157 158 } 158 159 159 160 160 Node Itroot() {161 Node root() { 161 162 return r; 162 163 }
Note: See TracChangeset
for help on using the changeset viewer.