lemon/suurballe.h
changeset 854 9a7e4e606f83
parent 853 ec0b1b423b8b
child 857 abb95d48e89e
equal deleted inserted replaced
10:7bd8265540ba 11:d706ecae73d2
    27 #include <vector>
    27 #include <vector>
    28 #include <limits>
    28 #include <limits>
    29 #include <lemon/bin_heap.h>
    29 #include <lemon/bin_heap.h>
    30 #include <lemon/path.h>
    30 #include <lemon/path.h>
    31 #include <lemon/list_graph.h>
    31 #include <lemon/list_graph.h>
       
    32 #include <lemon/dijkstra.h>
    32 #include <lemon/maps.h>
    33 #include <lemon/maps.h>
    33 
    34 
    34 namespace lemon {
    35 namespace lemon {
    35 
    36 
    36   /// \addtogroup shortest_path
    37   /// \addtogroup shortest_path
    95     /// The type of the path structures.
    96     /// The type of the path structures.
    96     typedef SimplePath<GR> Path;
    97     typedef SimplePath<GR> Path;
    97 
    98 
    98   private:
    99   private:
    99 
   100 
       
   101     typedef typename Digraph::template NodeMap<int> HeapCrossRef;
       
   102     typedef BinHeap<Length, HeapCrossRef> Heap;
       
   103 
   100     // ResidualDijkstra is a special implementation of the
   104     // ResidualDijkstra is a special implementation of the
   101     // Dijkstra algorithm for finding shortest paths in the
   105     // Dijkstra algorithm for finding shortest paths in the
   102     // residual network with respect to the reduced arc lengths
   106     // residual network with respect to the reduced arc lengths
   103     // and modifying the node potentials according to the
   107     // and modifying the node potentials according to the
   104     // distance of the nodes.
   108     // distance of the nodes.
   105     class ResidualDijkstra
   109     class ResidualDijkstra
   106     {
   110     {
   107       typedef typename Digraph::template NodeMap<int> HeapCrossRef;
       
   108       typedef BinHeap<Length, HeapCrossRef> Heap;
       
   109 
       
   110     private:
   111     private:
   111 
   112 
   112       const Digraph &_graph;
   113       const Digraph &_graph;
   113       const LengthMap &_length;
   114       const LengthMap &_length;
   114       const FlowMap &_flow;
   115       const FlowMap &_flow;
   276     std::vector<Path> _paths;
   277     std::vector<Path> _paths;
   277     int _path_num;
   278     int _path_num;
   278 
   279 
   279     // The pred arc map
   280     // The pred arc map
   280     PredMap _pred;
   281     PredMap _pred;
       
   282     
       
   283     // Data for full init
       
   284     PotentialMap *_init_dist;
       
   285     PredMap *_init_pred;
       
   286     bool _full_init;
   281 
   287 
   282   public:
   288   public:
   283 
   289 
   284     /// \brief Constructor.
   290     /// \brief Constructor.
   285     ///
   291     ///
   288     /// \param graph The digraph the algorithm runs on.
   294     /// \param graph The digraph the algorithm runs on.
   289     /// \param length The length (cost) values of the arcs.
   295     /// \param length The length (cost) values of the arcs.
   290     Suurballe( const Digraph &graph,
   296     Suurballe( const Digraph &graph,
   291                const LengthMap &length ) :
   297                const LengthMap &length ) :
   292       _graph(graph), _length(length), _flow(0), _local_flow(false),
   298       _graph(graph), _length(length), _flow(0), _local_flow(false),
   293       _potential(0), _local_potential(false), _pred(graph)
   299       _potential(0), _local_potential(false), _pred(graph),
       
   300       _init_dist(0), _init_pred(0)
   294     {}
   301     {}
   295 
   302 
   296     /// Destructor.
   303     /// Destructor.
   297     ~Suurballe() {
   304     ~Suurballe() {
   298       if (_local_flow) delete _flow;
   305       if (_local_flow) delete _flow;
   299       if (_local_potential) delete _potential;
   306       if (_local_potential) delete _potential;
       
   307       delete _init_dist;
       
   308       delete _init_pred;
   300     }
   309     }
   301 
   310 
   302     /// \brief Set the flow map.
   311     /// \brief Set the flow map.
   303     ///
   312     ///
   304     /// This function sets the flow map.
   313     /// This function sets the flow map.
   339       return *this;
   348       return *this;
   340     }
   349     }
   341 
   350 
   342     /// \name Execution Control
   351     /// \name Execution Control
   343     /// The simplest way to execute the algorithm is to call the run()
   352     /// The simplest way to execute the algorithm is to call the run()
   344     /// function.
   353     /// function.\n
   345     /// \n
   354     /// If you need to execute the algorithm many times using the same
       
   355     /// source node, then you may call fullInit() once and start()
       
   356     /// for each target node.\n
   346     /// If you only need the flow that is the union of the found
   357     /// If you only need the flow that is the union of the found
   347     /// arc-disjoint paths, you may call init() and findFlow().
   358     /// arc-disjoint paths, then you may call findFlow() instead of
       
   359     /// start().
   348 
   360 
   349     /// @{
   361     /// @{
   350 
   362 
   351     /// \brief Run the algorithm.
   363     /// \brief Run the algorithm.
   352     ///
   364     ///
   362     ///
   374     ///
   363     /// \note Apart from the return value, <tt>s.run(s, t, k)</tt> is
   375     /// \note Apart from the return value, <tt>s.run(s, t, k)</tt> is
   364     /// just a shortcut of the following code.
   376     /// just a shortcut of the following code.
   365     /// \code
   377     /// \code
   366     ///   s.init(s);
   378     ///   s.init(s);
   367     ///   s.findFlow(t, k);
   379     ///   s.start(t, k);
   368     ///   s.findPaths();
       
   369     /// \endcode
   380     /// \endcode
   370     int run(const Node& s, const Node& t, int k = 2) {
   381     int run(const Node& s, const Node& t, int k = 2) {
   371       init(s);
   382       init(s);
   372       findFlow(t, k);
   383       start(t, k);
   373       findPaths();
       
   374       return _path_num;
   384       return _path_num;
   375     }
   385     }
   376 
   386 
   377     /// \brief Initialize the algorithm.
   387     /// \brief Initialize the algorithm.
   378     ///
   388     ///
   379     /// This function initializes the algorithm.
   389     /// This function initializes the algorithm with the given source node.
   380     ///
   390     ///
   381     /// \param s The source node.
   391     /// \param s The source node.
   382     void init(const Node& s) {
   392     void init(const Node& s) {
   383       _s = s;
   393       _s = s;
   384 
   394 
   389       }
   399       }
   390       if (!_potential) {
   400       if (!_potential) {
   391         _potential = new PotentialMap(_graph);
   401         _potential = new PotentialMap(_graph);
   392         _local_potential = true;
   402         _local_potential = true;
   393       }
   403       }
   394       for (ArcIt e(_graph); e != INVALID; ++e) (*_flow)[e] = 0;
   404       _full_init = false;
   395       for (NodeIt n(_graph); n != INVALID; ++n) (*_potential)[n] = 0;
   405     }
       
   406 
       
   407     /// \brief Initialize the algorithm and perform Dijkstra.
       
   408     ///
       
   409     /// This function initializes the algorithm and performs a full
       
   410     /// Dijkstra search from the given source node. It makes consecutive
       
   411     /// executions of \ref start() "start(t, k)" faster, since they
       
   412     /// have to perform %Dijkstra only k-1 times.
       
   413     ///
       
   414     /// This initialization is usually worth using instead of \ref init()
       
   415     /// if the algorithm is executed many times using the same source node.
       
   416     ///
       
   417     /// \param s The source node.
       
   418     void fullInit(const Node& s) {
       
   419       // Initialize maps
       
   420       init(s);
       
   421       if (!_init_dist) {
       
   422         _init_dist = new PotentialMap(_graph);
       
   423       }
       
   424       if (!_init_pred) {
       
   425         _init_pred = new PredMap(_graph);
       
   426       }
       
   427 
       
   428       // Run a full Dijkstra
       
   429       typename Dijkstra<Digraph, LengthMap>
       
   430         ::template SetStandardHeap<Heap>
       
   431         ::template SetDistMap<PotentialMap>
       
   432         ::template SetPredMap<PredMap>
       
   433         ::Create dijk(_graph, _length);
       
   434       dijk.distMap(*_init_dist).predMap(*_init_pred);
       
   435       dijk.run(s);
       
   436       
       
   437       _full_init = true;
       
   438     }
       
   439 
       
   440     /// \brief Execute the algorithm.
       
   441     ///
       
   442     /// This function executes the algorithm.
       
   443     ///
       
   444     /// \param t The target node.
       
   445     /// \param k The number of paths to be found.
       
   446     ///
       
   447     /// \return \c k if there are at least \c k arc-disjoint paths from
       
   448     /// \c s to \c t in the digraph. Otherwise it returns the number of
       
   449     /// arc-disjoint paths found.
       
   450     ///
       
   451     /// \note Apart from the return value, <tt>s.start(t, k)</tt> is
       
   452     /// just a shortcut of the following code.
       
   453     /// \code
       
   454     ///   s.findFlow(t, k);
       
   455     ///   s.findPaths();
       
   456     /// \endcode
       
   457     int start(const Node& t, int k = 2) {
       
   458       findFlow(t, k);
       
   459       findPaths();
       
   460       return _path_num;
   396     }
   461     }
   397 
   462 
   398     /// \brief Execute the algorithm to find an optimal flow.
   463     /// \brief Execute the algorithm to find an optimal flow.
   399     ///
   464     ///
   400     /// This function executes the successive shortest path algorithm to
   465     /// This function executes the successive shortest path algorithm to
   410     ///
   475     ///
   411     /// \pre \ref init() must be called before using this function.
   476     /// \pre \ref init() must be called before using this function.
   412     int findFlow(const Node& t, int k = 2) {
   477     int findFlow(const Node& t, int k = 2) {
   413       _t = t;
   478       _t = t;
   414       ResidualDijkstra dijkstra(*this);
   479       ResidualDijkstra dijkstra(*this);
       
   480       
       
   481       // Initialization
       
   482       for (ArcIt e(_graph); e != INVALID; ++e) {
       
   483         (*_flow)[e] = 0;
       
   484       }
       
   485       if (_full_init) {
       
   486         for (NodeIt n(_graph); n != INVALID; ++n) {
       
   487           (*_potential)[n] = (*_init_dist)[n];
       
   488         }
       
   489         Node u = _t;
       
   490         Arc e;
       
   491         while ((e = (*_init_pred)[u]) != INVALID) {
       
   492           (*_flow)[e] = 1;
       
   493           u = _graph.source(e);
       
   494         }        
       
   495         _path_num = 1;
       
   496       } else {
       
   497         for (NodeIt n(_graph); n != INVALID; ++n) {
       
   498           (*_potential)[n] = 0;
       
   499         }
       
   500         _path_num = 0;
       
   501       }
   415 
   502 
   416       // Find shortest paths
   503       // Find shortest paths
   417       _path_num = 0;
       
   418       while (_path_num < k) {
   504       while (_path_num < k) {
   419         // Run Dijkstra
   505         // Run Dijkstra
   420         if (!dijkstra.run(_path_num)) break;
   506         if (!dijkstra.run(_path_num)) break;
   421         ++_path_num;
   507         ++_path_num;
   422 
   508