2 * src/test/preflow_test.cc - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
20 #include "test_tools.h"
21 #include <lemon/smart_graph.h>
22 #include <lemon/dimacs.h>
23 #include <lemon/preflow.h>
24 #include <lemon/skeletons/graph.h>
25 #include <lemon/skeletons/maps.h>
27 using namespace lemon;
32 typedef skeleton::StaticGraph Graph;
34 typedef Graph::Node Node;
35 typedef Graph::Edge Edge;
36 typedef skeleton::ReadMap<Edge,VType> CapMap;
37 typedef skeleton::ReadWriteMap<Edge,VType> FlowMap;
38 typedef skeleton::ReadWriteMap<Node,bool> CutMap;
40 typedef Preflow<Graph, int, CapMap, FlowMap> PType;
48 PType preflow_test(g,n,n,cap,flow);
51 preflow_test.flowValue();
52 preflow_test.setSource(n);
53 preflow_test.setFlow(flow);
55 preflow_test.phase1(PType::NO_FLOW);
56 preflow_test.minCut(cut);
58 preflow_test.phase2();
59 preflow_test.setTarget(n);
60 preflow_test.setCap(cap);
61 preflow_test.minMinCut(cut);
62 preflow_test.maxMinCut(cut);
65 int cut_value ( SmartGraph& g, SmartGraph::NodeMap<bool>& cut,
66 SmartGraph::EdgeMap<int>& cap) {
69 for(SmartGraph::EdgeIt e(g); e!=INVALID; ++e) {
70 if (cut[g.tail(e)] && !cut[g.head(e)]) c+=cap[e];
77 typedef SmartGraph Graph;
79 typedef Graph::Node Node;
80 typedef Graph::NodeIt NodeIt;
81 typedef Graph::EdgeIt EdgeIt;
82 typedef Graph::EdgeMap<int> CapMap;
83 typedef Graph::EdgeMap<int> FlowMap;
84 typedef Graph::NodeMap<bool> CutMap;
86 typedef Preflow<Graph, int> PType;
89 if( getenv("srcdir") ) {
90 f_name = std::string(getenv("srcdir")) + "/preflow_graph.dim";
93 f_name = "preflow_graph.dim";
96 std::ifstream file(f_name.c_str());
98 check(file, "Input file '" << f_name << "' not found.");
103 readDimacs(file, g, cap, s, t);
109 PType preflow_test(g, s, t, cap, flow);
110 preflow_test.run(PType::ZERO_FLOW);
112 CutMap min_cut(g,false);
113 preflow_test.minCut(min_cut);
114 int min_cut_value=cut_value(g,min_cut,cap);
116 CutMap min_min_cut(g,false);
117 preflow_test.minMinCut(min_min_cut);
118 int min_min_cut_value=cut_value(g,min_min_cut,cap);
120 CutMap max_min_cut(g,false);
121 preflow_test.maxMinCut(max_min_cut);
122 int max_min_cut_value=cut_value(g,max_min_cut,cap);
124 check(preflow_test.flowValue() == min_cut_value &&
125 min_cut_value == min_min_cut_value &&
126 min_min_cut_value == max_min_cut_value,
127 "The max flow value is not equal to the three min cut values.");
129 int flow_value=preflow_test.flowValue();
133 for(EdgeIt e(g); e!=INVALID; ++e) cap[e]=2*cap[e];
134 preflow_test.setCap(cap);
136 preflow_test.phase1(PType::PRE_FLOW);
138 CutMap min_cut1(g,false);
139 preflow_test.minCut(min_cut1);
140 min_cut_value=cut_value(g,min_cut1,cap);
142 check(preflow_test.flowValue() == min_cut_value &&
143 min_cut_value == 2*flow_value,
144 "The max flow value or the min cut value is wrong.");
146 preflow_test.phase2();
148 CutMap min_cut2(g,false);
149 preflow_test.minCut(min_cut2);
150 min_cut_value=cut_value(g,min_cut2,cap);
152 CutMap min_min_cut2(g,false);
153 preflow_test.minMinCut(min_min_cut2);
154 min_min_cut_value=cut_value(g,min_min_cut2,cap);
156 preflow_test.maxMinCut(max_min_cut);
157 max_min_cut_value=cut_value(g,max_min_cut,cap);
159 check(preflow_test.flowValue() == min_cut_value &&
160 min_cut_value == min_min_cut_value &&
161 min_min_cut_value == max_min_cut_value &&
162 min_cut_value == 2*flow_value,
163 "The max flow value or the three min cut values were not doubled");
168 for( int i=1; i==10; ++i ) {
173 preflow_test.setFlow(flow);
177 if ( tmp1 != INVALID ) s=tmp1;
181 if ( tmp2 != INVALID ) t=tmp2;
183 preflow_test.setSource(s);
184 preflow_test.setTarget(t);
188 CutMap min_cut3(g,false);
189 preflow_test.minCut(min_cut3);
190 min_cut_value=cut_value(g,min_cut3,cap);
192 CutMap min_min_cut3(g,false);
193 preflow_test.minMinCut(min_min_cut3);
194 min_min_cut_value=cut_value(g,min_min_cut3,cap);
196 preflow_test.maxMinCut(max_min_cut);
197 max_min_cut_value=cut_value(g,max_min_cut,cap);
199 check(preflow_test.flowValue() == min_cut_value &&
200 min_cut_value == min_min_cut_value &&
201 min_min_cut_value == max_min_cut_value,
202 "The max flow value or the three min cut values are incorrect.");