256 Node w=queue.front(); |
256 Node w=queue.front(); |
257 queue.pop(); |
257 queue.pop(); |
258 |
258 |
259 OutEdgeIt e; |
259 OutEdgeIt e; |
260 for(g->first(e,w) ; g->valid(e); g->next(e)) { |
260 for(g->first(e,w) ; g->valid(e); g->next(e)) { |
261 Node v=g->head(e); |
261 Node v=g->target(e); |
262 if (!M[v] && (*flow)[e] < (*capacity)[e] ) { |
262 if (!M[v] && (*flow)[e] < (*capacity)[e] ) { |
263 queue.push(v); |
263 queue.push(v); |
264 M.set(v, true); |
264 M.set(v, true); |
265 } |
265 } |
266 } |
266 } |
267 |
267 |
268 InEdgeIt f; |
268 InEdgeIt f; |
269 for(g->first(f,w) ; g->valid(f); g->next(f)) { |
269 for(g->first(f,w) ; g->valid(f); g->next(f)) { |
270 Node v=g->tail(f); |
270 Node v=g->source(f); |
271 if (!M[v] && (*flow)[f] > 0 ) { |
271 if (!M[v] && (*flow)[f] > 0 ) { |
272 queue.push(v); |
272 queue.push(v); |
273 M.set(v, true); |
273 M.set(v, true); |
274 } |
274 } |
275 } |
275 } |
302 queue.pop(); |
302 queue.pop(); |
303 |
303 |
304 |
304 |
305 InEdgeIt e; |
305 InEdgeIt e; |
306 for(g->first(e,w) ; g->valid(e); g->next(e)) { |
306 for(g->first(e,w) ; g->valid(e); g->next(e)) { |
307 Node v=g->tail(e); |
307 Node v=g->source(e); |
308 if (M[v] && (*flow)[e] < (*capacity)[e] ) { |
308 if (M[v] && (*flow)[e] < (*capacity)[e] ) { |
309 queue.push(v); |
309 queue.push(v); |
310 M.set(v, false); |
310 M.set(v, false); |
311 } |
311 } |
312 } |
312 } |
313 |
313 |
314 OutEdgeIt f; |
314 OutEdgeIt f; |
315 for(g->first(f,w) ; g->valid(f); g->next(f)) { |
315 for(g->first(f,w) ; g->valid(f); g->next(f)) { |
316 Node v=g->head(f); |
316 Node v=g->target(f); |
317 if (M[v] && (*flow)[f] > 0 ) { |
317 if (M[v] && (*flow)[f] > 0 ) { |
318 queue.push(v); |
318 queue.push(v); |
319 M.set(v, false); |
319 M.set(v, false); |
320 } |
320 } |
321 } |
321 } |
454 bfs_queue.pop(); |
454 bfs_queue.pop(); |
455 int l=level[v]+1; |
455 int l=level[v]+1; |
456 |
456 |
457 InEdgeIt e; |
457 InEdgeIt e; |
458 for(g->first(e,v); g->valid(e); g->next(e)) { |
458 for(g->first(e,v); g->valid(e); g->next(e)) { |
459 Node w=g->tail(e); |
459 Node w=g->source(e); |
460 if ( level[w] == n && w != s ) { |
460 if ( level[w] == n && w != s ) { |
461 bfs_queue.push(w); |
461 bfs_queue.push(w); |
462 Node first=level_list[l]; |
462 Node first=level_list[l]; |
463 if ( g->valid(first) ) left.set(first,w); |
463 if ( g->valid(first) ) left.set(first,w); |
464 right.set(w,first); |
464 right.set(w,first); |
472 OutEdgeIt e; |
472 OutEdgeIt e; |
473 for(g->first(e,s); g->valid(e); g->next(e)) |
473 for(g->first(e,s); g->valid(e); g->next(e)) |
474 { |
474 { |
475 Num c=(*capacity)[e]; |
475 Num c=(*capacity)[e]; |
476 if ( c <= 0 ) continue; |
476 if ( c <= 0 ) continue; |
477 Node w=g->head(e); |
477 Node w=g->target(e); |
478 if ( level[w] < n ) { |
478 if ( level[w] < n ) { |
479 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
479 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
480 flow->set(e, c); |
480 flow->set(e, c); |
481 excess.set(w, excess[w]+c); |
481 excess.set(w, excess[w]+c); |
482 } |
482 } |
499 int l=level[v]+1; |
499 int l=level[v]+1; |
500 |
500 |
501 InEdgeIt e; |
501 InEdgeIt e; |
502 for(g->first(e,v); g->valid(e); g->next(e)) { |
502 for(g->first(e,v); g->valid(e); g->next(e)) { |
503 if ( (*capacity)[e] <= (*flow)[e] ) continue; |
503 if ( (*capacity)[e] <= (*flow)[e] ) continue; |
504 Node w=g->tail(e); |
504 Node w=g->source(e); |
505 if ( level[w] == n && w != s ) { |
505 if ( level[w] == n && w != s ) { |
506 bfs_queue.push(w); |
506 bfs_queue.push(w); |
507 Node first=level_list[l]; |
507 Node first=level_list[l]; |
508 if ( g->valid(first) ) left.set(first,w); |
508 if ( g->valid(first) ) left.set(first,w); |
509 right.set(w,first); |
509 right.set(w,first); |
513 } |
513 } |
514 |
514 |
515 OutEdgeIt f; |
515 OutEdgeIt f; |
516 for(g->first(f,v); g->valid(f); g->next(f)) { |
516 for(g->first(f,v); g->valid(f); g->next(f)) { |
517 if ( 0 >= (*flow)[f] ) continue; |
517 if ( 0 >= (*flow)[f] ) continue; |
518 Node w=g->head(f); |
518 Node w=g->target(f); |
519 if ( level[w] == n && w != s ) { |
519 if ( level[w] == n && w != s ) { |
520 bfs_queue.push(w); |
520 bfs_queue.push(w); |
521 Node first=level_list[l]; |
521 Node first=level_list[l]; |
522 if ( g->valid(first) ) left.set(first,w); |
522 if ( g->valid(first) ) left.set(first,w); |
523 right.set(w,first); |
523 right.set(w,first); |
532 OutEdgeIt e; |
532 OutEdgeIt e; |
533 for(g->first(e,s); g->valid(e); g->next(e)) |
533 for(g->first(e,s); g->valid(e); g->next(e)) |
534 { |
534 { |
535 Num rem=(*capacity)[e]-(*flow)[e]; |
535 Num rem=(*capacity)[e]-(*flow)[e]; |
536 if ( rem <= 0 ) continue; |
536 if ( rem <= 0 ) continue; |
537 Node w=g->head(e); |
537 Node w=g->target(e); |
538 if ( level[w] < n ) { |
538 if ( level[w] < n ) { |
539 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
539 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
540 flow->set(e, (*capacity)[e]); |
540 flow->set(e, (*capacity)[e]); |
541 excess.set(w, excess[w]+rem); |
541 excess.set(w, excess[w]+rem); |
542 } |
542 } |
544 |
544 |
545 InEdgeIt f; |
545 InEdgeIt f; |
546 for(g->first(f,s); g->valid(f); g->next(f)) |
546 for(g->first(f,s); g->valid(f); g->next(f)) |
547 { |
547 { |
548 if ( (*flow)[f] <= 0 ) continue; |
548 if ( (*flow)[f] <= 0 ) continue; |
549 Node w=g->tail(f); |
549 Node w=g->source(f); |
550 if ( level[w] < n ) { |
550 if ( level[w] < n ) { |
551 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
551 if ( excess[w] <= 0 && w!=t ) active[level[w]].push(w); |
552 excess.set(w, excess[w]+(*flow)[f]); |
552 excess.set(w, excess[w]+(*flow)[f]); |
553 flow->set(f, 0); |
553 flow->set(f, 0); |
554 } |
554 } |
642 int operator[](const typename MapGraphWrapper::Node& n) |
642 int operator[](const typename MapGraphWrapper::Node& n) |
643 { return dist[n]; } |
643 { return dist[n]; } |
644 // int get(const typename MapGraphWrapper::Node& n) const { |
644 // int get(const typename MapGraphWrapper::Node& n) const { |
645 // return dist[n]; } |
645 // return dist[n]; } |
646 // bool get(const typename MapGraphWrapper::Edge& e) const { |
646 // bool get(const typename MapGraphWrapper::Edge& e) const { |
647 // return (dist.get(g->tail(e))<dist.get(g->head(e))); } |
647 // return (dist.get(g->source(e))<dist.get(g->target(e))); } |
648 bool operator[](const typename MapGraphWrapper::Edge& e) const { |
648 bool operator[](const typename MapGraphWrapper::Edge& e) const { |
649 return (dist[g->tail(e)]<dist[g->head(e)]); |
649 return (dist[g->source(e)]<dist[g->target(e)]); |
650 } |
650 } |
651 }; |
651 }; |
652 |
652 |
653 }; |
653 }; |
654 |
654 |
781 int l=level[v]+1; |
781 int l=level[v]+1; |
782 |
782 |
783 InEdgeIt e; |
783 InEdgeIt e; |
784 for(g->first(e,v); g->valid(e); g->next(e)) { |
784 for(g->first(e,v); g->valid(e); g->next(e)) { |
785 if ( (*capacity)[e] <= (*flow)[e] ) continue; |
785 if ( (*capacity)[e] <= (*flow)[e] ) continue; |
786 Node u=g->tail(e); |
786 Node u=g->source(e); |
787 if ( level[u] >= n ) { |
787 if ( level[u] >= n ) { |
788 bfs_queue.push(u); |
788 bfs_queue.push(u); |
789 level.set(u, l); |
789 level.set(u, l); |
790 if ( excess[u] > 0 ) active[l].push(u); |
790 if ( excess[u] > 0 ) active[l].push(u); |
791 } |
791 } |
792 } |
792 } |
793 |
793 |
794 OutEdgeIt f; |
794 OutEdgeIt f; |
795 for(g->first(f,v); g->valid(f); g->next(f)) { |
795 for(g->first(f,v); g->valid(f); g->next(f)) { |
796 if ( 0 >= (*flow)[f] ) continue; |
796 if ( 0 >= (*flow)[f] ) continue; |
797 Node u=g->head(f); |
797 Node u=g->target(f); |
798 if ( level[u] >= n ) { |
798 if ( level[u] >= n ) { |
799 bfs_queue.push(u); |
799 bfs_queue.push(u); |
800 level.set(u, l); |
800 level.set(u, l); |
801 if ( excess[u] > 0 ) active[l].push(u); |
801 if ( excess[u] > 0 ) active[l].push(u); |
802 } |
802 } |
844 |
844 |
845 //searching for augmenting path |
845 //searching for augmenting path |
846 while ( !bfs.finished() ) { |
846 while ( !bfs.finished() ) { |
847 ResGWOutEdgeIt e=bfs; |
847 ResGWOutEdgeIt e=bfs; |
848 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { |
848 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { |
849 Node v=res_graph.tail(e); |
849 Node v=res_graph.source(e); |
850 Node w=res_graph.head(e); |
850 Node w=res_graph.target(e); |
851 pred.set(w, e); |
851 pred.set(w, e); |
852 if (res_graph.valid(pred[v])) { |
852 if (res_graph.valid(pred[v])) { |
853 free.set(w, std::min(free[v], res_graph.resCap(e))); |
853 free.set(w, std::min(free[v], res_graph.resCap(e))); |
854 } else { |
854 } else { |
855 free.set(w, res_graph.resCap(e)); |
855 free.set(w, res_graph.resCap(e)); |
856 } |
856 } |
857 if (res_graph.head(e)==t) { _augment=true; break; } |
857 if (res_graph.target(e)==t) { _augment=true; break; } |
858 } |
858 } |
859 |
859 |
860 ++bfs; |
860 ++bfs; |
861 } //end of searching augmenting path |
861 } //end of searching augmenting path |
862 |
862 |
917 |
917 |
918 while ( !bfs.finished() ) { |
918 while ( !bfs.finished() ) { |
919 ResGWOutEdgeIt e=bfs; |
919 ResGWOutEdgeIt e=bfs; |
920 if (res_graph.valid(e)) { |
920 if (res_graph.valid(e)) { |
921 if (bfs.isBNodeNewlyReached()) { |
921 if (bfs.isBNodeNewlyReached()) { |
922 dist.set(res_graph.head(e), dist[res_graph.tail(e)]+1); |
922 dist.set(res_graph.target(e), dist[res_graph.source(e)]+1); |
923 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.tail(e)], res_graph_to_F[res_graph.head(e)]); |
923 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.source(e)], res_graph_to_F[res_graph.target(e)]); |
924 original_edge.update(); |
924 original_edge.update(); |
925 original_edge.set(f, e); |
925 original_edge.set(f, e); |
926 residual_capacity.update(); |
926 residual_capacity.update(); |
927 residual_capacity.set(f, res_graph.resCap(e)); |
927 residual_capacity.set(f, res_graph.resCap(e)); |
928 } else { |
928 } else { |
929 if (dist[res_graph.head(e)]==(dist[res_graph.tail(e)]+1)) { |
929 if (dist[res_graph.target(e)]==(dist[res_graph.source(e)]+1)) { |
930 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.tail(e)], res_graph_to_F[res_graph.head(e)]); |
930 typename MG::Edge f=F.addEdge(res_graph_to_F[res_graph.source(e)], res_graph_to_F[res_graph.target(e)]); |
931 original_edge.update(); |
931 original_edge.update(); |
932 original_edge.set(f, e); |
932 original_edge.set(f, e); |
933 residual_capacity.update(); |
933 residual_capacity.update(); |
934 residual_capacity.set(f, res_graph.resCap(e)); |
934 residual_capacity.set(f, res_graph.resCap(e)); |
935 } |
935 } |
979 typename MG::Node n=tF; |
979 typename MG::Node n=tF; |
980 Num augment_value=free[tF]; |
980 Num augment_value=free[tF]; |
981 while (F.valid(pred[n])) { |
981 while (F.valid(pred[n])) { |
982 typename MG::Edge e=pred[n]; |
982 typename MG::Edge e=pred[n]; |
983 res_graph.augment(original_edge[e], augment_value); |
983 res_graph.augment(original_edge[e], augment_value); |
984 n=F.tail(e); |
984 n=F.source(e); |
985 if (residual_capacity[e]==augment_value) |
985 if (residual_capacity[e]==augment_value) |
986 F.erase(e); |
986 F.erase(e); |
987 else |
987 else |
988 residual_capacity.set(e, residual_capacity[e]-augment_value); |
988 residual_capacity.set(e, residual_capacity[e]-augment_value); |
989 } |
989 } |
1013 bfs.pushAndSetReached(s); |
1013 bfs.pushAndSetReached(s); |
1014 DistanceMap<ResGW> dist(res_graph); |
1014 DistanceMap<ResGW> dist(res_graph); |
1015 while ( !bfs.finished() ) { |
1015 while ( !bfs.finished() ) { |
1016 ResGWOutEdgeIt e=bfs; |
1016 ResGWOutEdgeIt e=bfs; |
1017 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { |
1017 if (res_graph.valid(e) && bfs.isBNodeNewlyReached()) { |
1018 dist.set(res_graph.head(e), dist[res_graph.tail(e)]+1); |
1018 dist.set(res_graph.target(e), dist[res_graph.source(e)]+1); |
1019 } |
1019 } |
1020 ++bfs; |
1020 ++bfs; |
1021 } //computing distances from s in the residual graph |
1021 } //computing distances from s in the residual graph |
1022 |
1022 |
1023 //Subgraph containing the edges on some shortest paths |
1023 //Subgraph containing the edges on some shortest paths |
1110 // Num j2=a2[b2]; |
1110 // Num j2=a2[b2]; |
1111 Num augment_value=free1[n]; |
1111 Num augment_value=free1[n]; |
1112 while (erasing_res_graph.valid(pred[n])) { |
1112 while (erasing_res_graph.valid(pred[n])) { |
1113 typename ErasingResGW::OutEdgeIt e=pred[n]; |
1113 typename ErasingResGW::OutEdgeIt e=pred[n]; |
1114 res_graph.augment(e, augment_value); |
1114 res_graph.augment(e, augment_value); |
1115 n=erasing_res_graph.tail(e); |
1115 n=erasing_res_graph.source(e); |
1116 if (res_graph.resCap(e)==0) |
1116 if (res_graph.resCap(e)==0) |
1117 erasing_res_graph.erase(e); |
1117 erasing_res_graph.erase(e); |
1118 } |
1118 } |
1119 } |
1119 } |
1120 |
1120 |