diff -r ee5959aa4410 -r c280de819a73 src/work/athos/lp_old/max_flow_by_lp.cc --- a/src/work/athos/lp_old/max_flow_by_lp.cc Sun Apr 17 18:57:22 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -// -*- c++ -*- -#include -#include - -#include -#include -#include -#include -//#include -#include -#include -//#include -//#include -#include - -// Use a DIMACS max flow file as stdin. -// max_flow_demo < dimacs_max_flow_file - -using namespace lemon; - -int main(int, char **) { - - typedef ListGraph MutableGraph; - typedef ListGraph Graph; - typedef Graph::Node Node; - typedef Graph::Edge Edge; - typedef Graph::EdgeIt EdgeIt; - - Graph g; - - Node s, t; - Graph::EdgeMap cap(g); - //readDimacsMaxFlow(std::cin, g, s, t, cap); - readDimacs(std::cin, g, cap, s, t); - Timer ts; - Graph::EdgeMap flow(g); //0 flow - Preflow, Graph::EdgeMap > - max_flow_test(g, s, t, cap, flow); - AugmentingFlow, Graph::EdgeMap > - augmenting_flow_test(g, s, t, cap, flow); - - Graph::NodeMap cut(g); - - { - std::cout << "preflow ..." << std::endl; - ts.reset(); - max_flow_test.run(); - std::cout << "elapsed time: " << ts << std::endl; - std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; - max_flow_test.minCut(cut); - - for (EdgeIt e(g); e!=INVALID; ++e) { - if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) - std::cout << "Slackness does not hold!" << std::endl; - if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) - std::cout << "Slackness does not hold!" << std::endl; - } - } - -// { -// std::cout << "preflow ..." << std::endl; -// FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); -// ts.reset(); -// max_flow_test.preflow(Preflow, Graph::EdgeMap >::GEN_FLOW); -// std::cout << "elapsed time: " << ts << std::endl; -// std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; - -// FOR_EACH_LOC(Graph::EdgeIt, e, g) { -// if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) -// std::cout << "Slackness does not hold!" << std::endl; -// if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) -// std::cout << "Slackness does not hold!" << std::endl; -// } -// } - -// { -// std::cout << "wrapped preflow ..." << std::endl; -// FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); -// ts.reset(); -// pre_flow_res.run(); -// std::cout << "elapsed time: " << ts << std::endl; -// std::cout << "flow value: "<< pre_flow_test.flowValue() << std::endl; -// } - - { - std::cout << "physical blocking flow augmentation ..." << std::endl; - for (EdgeIt e(g); e!=INVALID; ++e) flow.set(e, 0); - ts.reset(); - int i=0; - while (augmenting_flow_test.augmentOnBlockingFlow()) { ++i; } - std::cout << "elapsed time: " << ts << std::endl; - std::cout << "number of augmentation phases: " << i << std::endl; - std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl; - - for (EdgeIt e(g); e!=INVALID; ++e) { - if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) - std::cout << "Slackness does not hold!" << std::endl; - if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) - std::cout << "Slackness does not hold!" << std::endl; - } - } - -// { -// std::cout << "faster physical blocking flow augmentation ..." << std::endl; -// FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); -// ts.reset(); -// int i=0; -// while (max_flow_test.augmentOnBlockingFlow1()) { ++i; } -// std::cout << "elapsed time: " << ts << std::endl; -// std::cout << "number of augmentation phases: " << i << std::endl; -// std::cout << "flow value: "<< max_flow_test.flowValue() << std::endl; -// } - - { - std::cout << "on-the-fly blocking flow augmentation ..." << std::endl; - for (EdgeIt e(g); e!=INVALID; ++e) flow.set(e, 0); - ts.reset(); - int i=0; - while (augmenting_flow_test.augmentOnBlockingFlow2()) { ++i; } - std::cout << "elapsed time: " << ts << std::endl; - std::cout << "number of augmentation phases: " << i << std::endl; - std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl; - - for (EdgeIt e(g); e!=INVALID; ++e) { - if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) - std::cout << "Slackness does not hold!" << std::endl; - if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) - std::cout << "Slackness does not hold!" << std::endl; - } - } - -// { -// std::cout << "on-the-fly shortest path augmentation ..." << std::endl; -// FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); -// ts.reset(); -// int i=0; -// while (augmenting_flow_test.augmentOnShortestPath()) { ++i; } -// std::cout << "elapsed time: " << ts << std::endl; -// std::cout << "number of augmentation phases: " << i << std::endl; -// std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl; - -// FOR_EACH_LOC(Graph::EdgeIt, e, g) { -// if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) -// std::cout << "Slackness does not hold!" << std::endl; -// if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) -// std::cout << "Slackness does not hold!" << std::endl; -// } -// } - -// { -// std::cout << "on-the-fly shortest path augmentation ..." << std::endl; -// FOR_EACH_LOC(Graph::EdgeIt, e, g) flow.set(e, 0); -// ts.reset(); -// int i=0; -// while (augmenting_flow_test.augmentOnShortestPath2()) { ++i; } -// std::cout << "elapsed time: " << ts << std::endl; -// std::cout << "number of augmentation phases: " << i << std::endl; -// std::cout << "flow value: "<< augmenting_flow_test.flowValue() << std::endl; - -// FOR_EACH_LOC(Graph::EdgeIt, e, g) { -// if (cut[g.source(e)] && !cut[g.target(e)] && !flow[e]==cap[e]) -// std::cout << "Slackness does not hold!" << std::endl; -// if (!cut[g.source(e)] && cut[g.target(e)] && flow[e]>0) -// std::cout << "Slackness does not hold!" << std::endl; -// } -// } - - ts.reset(); - - Edge e=g.addEdge(t, s); - Graph::EdgeMap cost(g, 0); - cost.set(e, -1); - cap.set(e, 10000); - typedef ConstMap Excess; - Excess excess(0); - typedef ConstMap LCap; - LCap lcap(0); - - MinCostGenFlow - min_cost(g, excess, lcap, cap, flow, cost); - min_cost.feasible(); - min_cost.runByLP(); - - std::cout << "elapsed time: " << ts << std::endl; - std::cout << "flow value: "<< flow[e] << std::endl; -}