src/hugo/preflow.h
changeset 911 89a4fbb99cad
parent 906 17f31d280385
child 920 2d6c8075d9d0
equal deleted inserted replaced
4:a2503a08d25b 5:1f170c57e1db
    42   ///edges should be passed to the algorithm through the
    42   ///edges should be passed to the algorithm through the
    43   ///constructor. It is possible to change these quantities using the
    43   ///constructor. It is possible to change these quantities using the
    44   ///functions \ref setSource, \ref setTarget, \ref setCap and \ref
    44   ///functions \ref setSource, \ref setTarget, \ref setCap and \ref
    45   ///setFlow.
    45   ///setFlow.
    46   ///
    46   ///
    47   ///After running \ref phase1() or \ref preflow(), the actual flow
    47   ///After running \ref hugo::Preflow::phase1() "phase1()"
       
    48   ///or \ref hugo::Preflow::run() "run()", the actual flow
    48   ///value can be obtained by calling \ref flowValue(). The minimum
    49   ///value can be obtained by calling \ref flowValue(). The minimum
    49   ///value cut can be written into a <tt>bool</tt> node map by
    50   ///value cut can be written into a <tt>bool</tt> node map by
    50   ///calling \ref minCut(). (\ref minMinCut() and \ref maxMinCut() writes
    51   ///calling \ref minCut(). (\ref minMinCut() and \ref maxMinCut() writes
    51   ///the inclusionwise minimum and maximum of the minimum value cuts,
    52   ///the inclusionwise minimum and maximum of the minimum value cuts,
    52   ///resp.)
    53   ///resp.)
    94     ///- \c GEN_FLOW: any flow, i.e. the sum of the in-flows equals to
    95     ///- \c GEN_FLOW: any flow, i.e. the sum of the in-flows equals to
    95     ///the sum of the out-flows in every node except the \e source and
    96     ///the sum of the out-flows in every node except the \e source and
    96     ///the \e target.
    97     ///the \e target.
    97     ///- \c PRE_FLOW: any preflow, i.e. the sum of the in-flows is at 
    98     ///- \c PRE_FLOW: any preflow, i.e. the sum of the in-flows is at 
    98     ///least the sum of the out-flows in every node except the \e source.
    99     ///least the sum of the out-flows in every node except the \e source.
    99     ///- \c NO_FLOW: indicates an unspecified edge map. \ref flow will be 
   100     ///- \c NO_FLOW: indicates an unspecified edge map. \c flow will be 
   100     ///set to the constant zero flow in the beginning of the algorithm in this case.
   101     ///set to the constant zero flow in the beginning of
       
   102     ///the algorithm in this case.
   101     ///
   103     ///
   102     enum FlowEnum{
   104     enum FlowEnum{
   103       NO_FLOW,
   105       NO_FLOW,
   104       ZERO_FLOW,
   106       ZERO_FLOW,
   105       GEN_FLOW,
   107       GEN_FLOW,
   192 
   194 
   193     ///The preflow algorithm consists of two phases, this method runs the
   195     ///The preflow algorithm consists of two phases, this method runs the
   194     ///first phase. After the first phase the maximum flow value and a
   196     ///first phase. After the first phase the maximum flow value and a
   195     ///minimum value cut can already be computed, though a maximum flow
   197     ///minimum value cut can already be computed, though a maximum flow
   196     ///is not yet obtained. So after calling this method \ref flowValue
   198     ///is not yet obtained. So after calling this method \ref flowValue
   197     ///and \ref actMinCut gives proper results.
   199     ///and \ref MinCut() gives proper results.
   198     ///\warning \ref minCut, \ref minMinCut and \ref maxMinCut do not
   200     ///\warning \ref minCut(), \ref minMinCut() and \ref maxMinCut() do not
   199     ///give minimum value cuts unless calling \ref phase2.
   201     ///give minimum value cuts unless calling \ref phase2().
   200     void phase1()
   202     void phase1()
   201     {
   203     {
   202       int heur0=(int)(H0*n);  //time while running 'bound decrease'
   204       int heur0=(int)(H0*n);  //time while running 'bound decrease'
   203       int heur1=(int)(H1*n);  //time while running 'highest label'
   205       int heur1=(int)(H1*n);  //time while running 'highest label'
   204       int heur=heur1;         //starting time interval (#of relabels)
   206       int heur=heur1;         //starting time interval (#of relabels)
   347     }
   349     }
   348 
   350 
   349     /// Returns the value of the maximum flow.
   351     /// Returns the value of the maximum flow.
   350 
   352 
   351     /// Returns the value of the maximum flow by returning the excess
   353     /// Returns the value of the maximum flow by returning the excess
   352     /// of the target node \ref t. This value equals to the value of
   354     /// of the target node \c t. This value equals to the value of
   353     /// the maximum flow already after running \ref phase1.
   355     /// the maximum flow already after running \ref phase1.
   354     Num flowValue() const {
   356     Num flowValue() const {
   355       return excess[t];
   357       return excess[t];
   356     }
   358     }
   357 
   359 
   360 
   362 
   361     ///Sets \c M to the characteristic vector of a minimum value
   363     ///Sets \c M to the characteristic vector of a minimum value
   362     ///cut. This method can be called both after running \ref
   364     ///cut. This method can be called both after running \ref
   363     ///phase1 and \ref phase2. It is much faster after
   365     ///phase1 and \ref phase2. It is much faster after
   364     ///\ref phase1.  \pre M should be a bool-valued node-map. \pre
   366     ///\ref phase1.  \pre M should be a bool-valued node-map. \pre
   365     ///If \ref mincut is called after \ref phase2 then M should
   367     ///If \ref minCut() is called after \ref phase2() then M should
   366     ///be initialized to false.
   368     ///be initialized to false.
   367     template<typename _CutMap>
   369     template<typename _CutMap>
   368     void minCut(_CutMap& M) const {
   370     void minCut(_CutMap& M) const {
   369       switch ( status ) {
   371       switch ( status ) {
   370 	case AFTER_PREFLOW_PHASE_1:
   372 	case AFTER_PREFLOW_PHASE_1:
   423     ///Returns the inclusionwise maximum of the minimum value cuts.
   425     ///Returns the inclusionwise maximum of the minimum value cuts.
   424 
   426 
   425     ///Sets \c M to the characteristic vector of the minimum value cut
   427     ///Sets \c M to the characteristic vector of the minimum value cut
   426     ///which is inclusionwise maximum. It is computed by processing a
   428     ///which is inclusionwise maximum. It is computed by processing a
   427     ///backward bfs from the target node \c t in the residual graph.
   429     ///backward bfs from the target node \c t in the residual graph.
   428     ///\pre \ref phase2() or preflow() should already be run.
   430     ///\pre \ref phase2() or run() should already be run.
   429     template<typename _CutMap>
   431     template<typename _CutMap>
   430     void maxMinCut(_CutMap& M) const {
   432     void maxMinCut(_CutMap& M) const {
   431 
   433 
   432       for(NodeIt v(*g) ; v!=INVALID; ++v) M.set(v, true);
   434       for(NodeIt v(*g) ; v!=INVALID; ++v) M.set(v, true);
   433 
   435