kolmogorov_max_flow_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 435 行 · 第 1/2 页

CPP
435
字号
//  Copyright (c) 2006, Stephan Diederich////  This code may be used under either of the following two licences:////    Permission is hereby granted, free of charge, to any person//    obtaining a copy of this software and associated documentation//    files (the "Software"), to deal in the Software without//    restriction, including without limitation the rights to use,//    copy, modify, merge, publish, distribute, sublicense, and/or//    sell copies of the Software, and to permit persons to whom the//    Software is furnished to do so, subject to the following//    conditions:////    The above copyright notice and this permission notice shall be//    included in all copies or substantial portions of the Software.////    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,//    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES//    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND//    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT//    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,//    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING//    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR//    OTHER DEALINGS IN THE SOFTWARE. OF SUCH DAMAGE.////  Or:////    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)#include <vector>#include <iterator>#include <iostream>#include <algorithm>#include <fstream>#include <boost/test/minimal.hpp>#include <boost/graph/kolmogorov_max_flow.hpp>//boost utilities we use#include <boost/graph/adjacency_list.hpp>#include <boost/graph/adjacency_matrix.hpp>#include <boost/graph/random.hpp>#include <boost/property_map.hpp>#include <boost/random/linear_congruential.hpp>#include <boost/lexical_cast.hpp>using namespace boost;template <typename Graph, typename CapacityMap, typename ReverseEdgeMap>std::pair< typename graph_traits<Graph>::vertex_descriptor,typename graph_traits<Graph>::vertex_descriptor>fill_random_max_flow_graph(Graph& g, CapacityMap cap, ReverseEdgeMap rev, typename graph_traits<Graph>::vertices_size_type n_verts,                            typename graph_traits<Graph>::edges_size_type n_edges, std::size_t seed){  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;  const int cap_low = 1;  const int cap_high = 1000;    //init random numer generator  minstd_rand gen(seed);  //generate graph  generate_random_graph(g, n_verts, n_edges, gen);    //init an uniform distribution int generator  typedef variate_generator<minstd_rand, uniform_int<int> > tIntGen;  tIntGen int_gen(gen, uniform_int<int>(cap_low, cap_high));  //randomize edge-capacities  //randomize_property<edge_capacity, Graph, tIntGen> (g,int_gen); //we cannot use this, as we have no idea how properties are stored, right?  typename graph_traits<Graph>::edge_iterator ei, e_end;  for(tie(ei,e_end) = edges(g); ei != e_end; ++ei)    cap[*ei] = int_gen();  //get source and sink node  vertex_descriptor s = random_vertex(g, gen);  vertex_descriptor t = graph_traits<Graph>::null_vertex();  while(t == graph_traits<Graph>::null_vertex() || t == s)    t = random_vertex(g, gen);    //add reverse edges (ugly... how to do better?!)  std::list<edge_descriptor> edges_copy;  tie(ei, e_end) = edges(g);    std::copy(ei, e_end, std::back_insert_iterator< std::list<edge_descriptor> >(edges_copy));  while(!edges_copy.empty()){    edge_descriptor old_edge = edges_copy.front();    edges_copy.pop_front();    vertex_descriptor source_vertex = target(old_edge, g);      vertex_descriptor target_vertex = source(old_edge, g);    bool inserted;    edge_descriptor  new_edge;    tie(new_edge,inserted) = add_edge(source_vertex, target_vertex, g);     assert(inserted);    rev[old_edge] = new_edge;    rev[new_edge] = old_edge ;    cap[new_edge] = 0;  }  return std::make_pair(s,t);}long test_adjacency_list_vecS(int n_verts, int n_edges, std::size_t seed){  typedef adjacency_list_traits<vecS, vecS, directedS> tVectorTraits;  typedef adjacency_list<vecS, vecS, directedS,  property<vertex_index_t, long,  property<vertex_predecessor_t, tVectorTraits::edge_descriptor,  property<vertex_color_t, boost::default_color_type,  property<vertex_distance_t, long> > > >,  property<edge_capacity_t, long,  property<edge_residual_capacity_t, long,  property<edge_reverse_t, tVectorTraits::edge_descriptor > > > > tVectorGraph;    tVectorGraph g;    graph_traits<tVectorGraph>::vertex_descriptor src,sink;  tie(src,sink) = fill_random_max_flow_graph(g, get(edge_capacity,g), get(edge_reverse, g), n_verts, n_edges, seed);    return kolmogorov_max_flow(g, get(edge_capacity, g),                             get(edge_residual_capacity, g),                             get(edge_reverse, g),                             get(vertex_predecessor, g),                             get(vertex_color, g),                             get(vertex_distance, g),                             get(vertex_index, g),                             src, sink);}long test_adjacency_list_listS(int n_verts, int n_edges, std::size_t seed){  typedef adjacency_list_traits<listS, listS, directedS> tListTraits;  typedef adjacency_list<listS, listS, directedS,  property<vertex_index_t, long,  property<vertex_predecessor_t, tListTraits::edge_descriptor,  property<vertex_color_t, boost::default_color_type,  property<vertex_distance_t, long> > > >,  property<edge_capacity_t, long,  property<edge_residual_capacity_t, long,  property<edge_reverse_t, tListTraits::edge_descriptor > > > > tListGraph;    tListGraph g;    graph_traits<tListGraph>::vertex_descriptor src,sink;  tie(src,sink) = fill_random_max_flow_graph(g, get(edge_capacity,g), get(edge_reverse, g), n_verts, n_edges, seed);    //initialize vertex indices  graph_traits<tListGraph>::vertex_iterator vi,v_end;  graph_traits<tListGraph>::vertices_size_type index = 0;  for(tie(vi, v_end) = vertices(g); vi != v_end; ++vi){    put(vertex_index, g, *vi, index++);  }  return kolmogorov_max_flow(g, get(edge_capacity, g),                             get(edge_residual_capacity, g),                             get(edge_reverse, g),                             get(vertex_predecessor, g),                             get(vertex_color, g),                             get(vertex_distance, g),                             get(vertex_index, g),                             src, sink);}template<typename EdgeDescriptor>    struct Node{  boost::default_color_type vertex_color;  long vertex_distance;  EdgeDescriptor vertex_predecessor;};template<typename EdgeDescriptor>    struct Link{  long edge_capacity;  long edge_residual_capacity;  EdgeDescriptor edge_reverse;};long test_bundled_properties(int n_verts, int n_edges, std::size_t seed){  typedef adjacency_list_traits<vecS, vecS, directedS> tTraits;  typedef Node<tTraits::edge_descriptor> tVertex;  typedef Link<tTraits::edge_descriptor> tEdge;  typedef adjacency_list<vecS, vecS, directedS, tVertex, tEdge> tBundleGraph;    tBundleGraph g;  graph_traits<tBundleGraph>::vertex_descriptor src,sink;  tie(src,sink) = fill_random_max_flow_graph(g, get(&tEdge::edge_capacity,g), get(&tEdge::edge_reverse, g), n_verts, n_edges, seed);  return kolmogorov_max_flow(g, get(&tEdge::edge_capacity, g),                             get(&tEdge::edge_residual_capacity, g),                             get(&tEdge::edge_reverse, g),                             get(&tVertex::vertex_predecessor, g),                             get(&tVertex::vertex_color, g),                             get(&tVertex::vertex_distance, g),                             get(vertex_index, g),                             src, sink);}long test_overloads(int n_verts, int n_edges, std::size_t seed){  typedef adjacency_list_traits<vecS, vecS, directedS> tTraits;  typedef property <edge_capacity_t, long,     property<edge_residual_capacity_t, long,     property<edge_reverse_t, tTraits::edge_descriptor> > >tEdgeProperty;  typedef adjacency_list<vecS, vecS, directedS, no_property, tEdgeProperty> tGraph;    tGraph g;    graph_traits<tGraph>::vertex_descriptor src,sink;  tie(src,sink) = fill_random_max_flow_graph(g, get(edge_capacity,g), get(edge_reverse, g), n_verts, n_edges, seed);  std::vector<graph_traits<tGraph>::edge_descriptor> predecessor_vec(n_verts);  std::vector<default_color_type> color_vec(n_verts);  std::vector<graph_traits<tGraph>::vertices_size_type> distance_vec(n_verts);  long flow_overload_1 = kolmogorov_max_flow(g, get(edge_capacity,g), get(edge_residual_capacity,g), get(edge_reverse,g), get(vertex_index,g), src, sink);    long flow_overload_2 = kolmogorov_max_flow(g, get(edge_capacity,g), get(edge_residual_capacity,g), get(edge_reverse,g),                                             &(color_vec[0]), get(vertex_index,g), src, sink);    BOOST_CHECK(flow_overload_1 == flow_overload_2);  return flow_overload_1;}template <class Graph, class EdgeCapacityMap, class ResidualCapacityEdgeMap, class ReverseEdgeMap, class PredecessorMap, class ColorMap,  class DistanceMap, class IndexMap>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?