summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/graph/example/push-relabel-eg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/graph/example/push-relabel-eg.cpp')
-rw-r--r--src/boost/libs/graph/example/push-relabel-eg.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/boost/libs/graph/example/push-relabel-eg.cpp b/src/boost/libs/graph/example/push-relabel-eg.cpp
new file mode 100644
index 000000000..04a6fa485
--- /dev/null
+++ b/src/boost/libs/graph/example/push-relabel-eg.cpp
@@ -0,0 +1,87 @@
+//=======================================================================
+// Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include <boost/config.hpp>
+#include <iostream>
+#include <string>
+#include <boost/graph/push_relabel_max_flow.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/read_dimacs.hpp>
+
+// Use a DIMACS network flow file as stdin.
+// push-relabel-eg < max_flow.dat
+//
+// Sample output:
+// c The total flow:
+// s 13
+//
+// c flow values:
+// f 0 6 3
+// f 0 1 0
+// f 0 2 10
+// f 1 5 1
+// f 1 0 0
+// f 1 3 0
+// f 2 4 4
+// f 2 3 6
+// f 2 0 0
+// f 3 7 5
+// f 3 2 0
+// f 3 1 1
+// f 4 5 4
+// f 4 6 0
+// f 5 4 0
+// f 5 7 5
+// f 6 7 3
+// f 6 4 0
+// f 7 6 0
+// f 7 5 0
+
+int main()
+{
+ using namespace boost;
+ typedef adjacency_list_traits< vecS, vecS, directedS > Traits;
+ typedef adjacency_list< vecS, vecS, directedS,
+ property< vertex_name_t, std::string >,
+ property< edge_capacity_t, long,
+ property< edge_residual_capacity_t, long,
+ property< edge_reverse_t, Traits::edge_descriptor > > > >
+ Graph;
+ Graph g;
+
+ property_map< Graph, edge_capacity_t >::type capacity
+ = get(edge_capacity, g);
+ property_map< Graph, edge_residual_capacity_t >::type residual_capacity
+ = get(edge_residual_capacity, g);
+ property_map< Graph, edge_reverse_t >::type rev = get(edge_reverse, g);
+ Traits::vertex_descriptor s, t;
+ read_dimacs_max_flow(g, capacity, rev, s, t);
+
+#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
+ property_map< Graph, vertex_index_t >::type indexmap = get(vertex_index, g);
+ long flow = push_relabel_max_flow(
+ g, s, t, capacity, residual_capacity, rev, indexmap);
+#else
+ long flow = push_relabel_max_flow(g, s, t);
+#endif
+
+ std::cout << "c The total flow:" << std::endl;
+ std::cout << "s " << flow << std::endl << std::endl;
+ std::cout << "c flow values:" << std::endl;
+ graph_traits< Graph >::vertex_iterator u_iter, u_end;
+ graph_traits< Graph >::out_edge_iterator ei, e_end;
+ for (boost::tie(u_iter, u_end) = vertices(g); u_iter != u_end; ++u_iter)
+ for (boost::tie(ei, e_end) = out_edges(*u_iter, g); ei != e_end; ++ei)
+ if (capacity[*ei] > 0)
+ std::cout << "f " << *u_iter << " " << target(*ei, g) << " "
+ << (capacity[*ei] - residual_capacity[*ei])
+ << std::endl;
+ return EXIT_SUCCESS;
+}