Files
ortools-clone/docs/cpp_graph/min__cost__flow_8h_source.html
2020-08-03 12:19:07 +02:00

745 lines
143 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>OR-Tools</title>
<meta http-equiv="Content-Type" content="text/html;"/>
<meta charset="utf-8"/>
<!--<link rel='stylesheet' type='text/css' href="https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>-->
<link rel="stylesheet" type="text/css" href="ortools.css" title="default" media="screen,print" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
</head>
<body>
<div id="banner-container">
<div id="banner">
<span id="sfml">Google OR-Tools 7.8</span>
</div>
</div>
<div id="content" style="width: 100%; overflow: hidden;">
<div style="margin-left: 15px; margin-top: 5px; float: left; color: #145A32;">
<h2>C++ Reference</h2>
<ul>
<li><a href="../cpp_algorithms/annotated.html">Algorithms</a></li>
<li><a href="../cpp_sat/annotated.html">CP-SAT</a></li>
<li><a href="../cpp_graph/annotated.html">Graph</a></li>
<li><a href="../cpp_routing/annotated.html">Routing</a></li>
<li><a href="../cpp_linear/annotated.html">Linear solver</a></li>
</ul>
</div>
<div id="content">
<div align="center">
<h1 style="color: #145A32;">C++ Reference: Graph</h1>
</div>
<!-- Generated by Doxygen 1.8.18 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_725f3a5915051842f84e3ea508be2a62.html">graph</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">min_cost_flow.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="min__cost__flow_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">// Copyright 2010-2018 Google LLC</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">// limitations under the License.</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// An implementation of a cost-scaling push-relabel algorithm for</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// the min-cost flow problem.</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">// In the following, we consider a graph G = (V,E) where V denotes the set</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// of nodes (vertices) in the graph, E denotes the set of arcs (edges).</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// n = |V| denotes the number of nodes in the graph, and m = |E| denotes the</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">// number of arcs in the graph.</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment">// With each arc (v,w) is associated a nonnegative capacity u(v,w)</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">// (where &#39;u&#39; stands for &quot;upper bound&quot;) and a unit cost c(v,w). With</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">// each node v is associated a quantity named supply(v), which</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment">// represents a supply of fluid (if &gt;0) or a demand (if &lt;0).</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">// Furthermore, no fluid is created in the graph so</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">// sum_{v in V} supply(v) = 0.</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment">// A flow is a function from E to R such that:</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="comment">// a) f(v,w) &lt;= u(v,w) for all (v,w) in E (capacity constraint).</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment">// b) f(v,w) = -f(w,v) for all (v,w) in E (flow antisymmetry constraint).</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">// c) sum on v f(v,w) + supply(w) = 0 (flow conservation).</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">// The cost of a flow is sum on (v,w) in E ( f(v,w) * c(v,w) ) [Note:</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="comment">// It can be confusing to beginners that the cost is actually double</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">// the amount that it might seem at first because of flow</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">// antisymmetry.]</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment">// The problem to solve: find a flow of minimum cost such that all the</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment">// fluid flows from the supply nodes to the demand nodes.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">// The principles behind this algorithm are the following:</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">// 1/ handle pseudo-flows instead of flows and refine pseudo-flows until an</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// epsilon-optimal minimum-cost flow is obtained,</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">// 2/ deal with epsilon-optimal pseudo-flows.</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment">// 1/ A pseudo-flow is like a flow, except that a node&#39;s outflow minus</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment">// its inflow can be different from its supply. If it is the case at a</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment">// given node v, it is said that there is an excess (or deficit) at</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment">// node v. A deficit is denoted by a negative excess and inflow =</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment">// outflow + excess.</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment">// (Look at ortools/graph/max_flow.h to see that the definition</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment">// of preflow is more restrictive than the one for pseudo-flow in that a preflow</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment">// only allows non-negative excesses, i.e., no deficit.)</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment">// More formally, a pseudo-flow is a function f such that:</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment">// a) f(v,w) &lt;= u(v,w) for all (v,w) in E (capacity constraint).</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment">// b) f(v,w) = -f(w,v) for all (v,w) in E (flow antisymmetry constraint).</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment">// For each v in E, we also define the excess at node v, the algebraic sum of</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment">// all the incoming preflows at this node, added together with the supply at v.</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment">// excess(v) = sum on u f(u,v) + supply(v)</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment">// The goal of the algorithm is to obtain excess(v) = 0 for all v in V, while</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment">// consuming capacity on some arcs, at the lowest possible cost.</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="comment">// 2/ Internally to the algorithm and its analysis (but invisibly to</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="comment">// the client), each node has an associated &quot;price&quot; (or potential), in</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="comment">// addition to its excess. It is formally a function from E to R (the</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="comment">// set of real numbers.). For a given price function p, the reduced</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="comment">// cost of an arc (v,w) is:</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="comment">// c_p(v,w) = c(v,w) + p(v) - p(w)</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="comment">// (c(v,w) is the cost of arc (v,w).) For those familiar with linear</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="comment">// programming, the price function can be viewed as a set of dual</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;<span class="comment">// variables.</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="comment">// For a constant epsilon &gt;= 0, a pseudo-flow f is said to be epsilon-optimal</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="comment">// with respect to a price function p if for every residual arc (v,w) in E,</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="comment">// c_p(v,w) &gt;= -epsilon.</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="comment">// A flow f is optimal if and only if there exists a price function p such that</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="comment">// no arc is admissible with respect to f and p.</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="comment">// If the arc costs are integers, and epsilon &lt; 1/n, any epsilon-optimal flow</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<span class="comment">// is optimal. The integer cost case is handled by multiplying all the arc costs</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="comment">// and the initial value of epsilon by (n+1). When epsilon reaches 1, and</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment">// the solution is epsilon-optimal, it means: for all residual arc (v,w) in E,</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment">// (n+1) * c_p(v,w) &gt;= -1, thus c_p(v,w) &gt;= -1/(n+1) &gt;= 1/n, and the</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment">// solution is optimal.</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="comment">// A node v is said to be *active* if excess(v) &gt; 0.</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="comment">// In this case the following operations can be applied to it:</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="comment">// - if there are *admissible* incident arcs, i.e. arcs which are not saturated,</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment">// and whose reduced costs are negative, a PushFlow operation can</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment">// be applied. It consists in sending as much flow as both the excess at the</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="comment">// node and the capacity of the arc permit.</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="comment">// - if there are no admissible arcs, the active node considered is relabeled,</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="comment">// This is implemented in Discharge, which itself calls PushFlow and Relabel.</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment">// Discharge itself is called by Refine. Refine first saturates all the</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment">// admissible arcs, then builds a stack of active nodes. It then applies</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;<span class="comment">// Discharge for each active node, possibly adding new ones in the process,</span></div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="comment">// until no nodes are active. In that case an epsilon-optimal flow is obtained.</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="comment">// Optimize iteratively calls Refine, while epsilon &gt; 1, and divides epsilon by</span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="comment">// alpha (set by default to 5) before each iteration.</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="comment">// The algorithm starts with epsilon = C, where C is the maximum absolute value</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<span class="comment">// of the arc costs. In the integer case which we are dealing with, since all</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="comment">// costs are multiplied by (n+1), the initial value of epsilon is (n+1)*C.</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="comment">// The algorithm terminates when epsilon = 1, and Refine() has been called.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="comment">// In this case, a minimum-cost flow is obtained.</span></div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="comment">// The complexity of the algorithm is O(n^2*m*log(n*C)) where C is the value of</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<span class="comment">// the largest arc cost in the graph.</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="comment">// IMPORTANT:</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="comment">// The algorithm is not able to detect the infeasibility of a problem (i.e.,</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="comment">// when a bottleneck in the network prohibits sending all the supplies.)</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="comment">// Worse, it could in some cases loop forever. This is why feasibility checking</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="comment">// is enabled by default (FLAGS_min_cost_flow_check_feasibility=true.)</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="comment">// Feasibility checking is implemented using a max-flow, which has a much lower</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="comment">// complexity. The impact on performance is negligible, while the risk of being</span></div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="comment">// caught in an endless loop is removed. Note that using the feasibility checker</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;<span class="comment">// roughly doubles the memory consumption.</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="comment">// The starting reference for this class of algorithms is:</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="comment">// A.V. Goldberg and R.E. Tarjan, &quot;Finding Minimum-Cost Circulations by</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="comment">// Successive Approximation.&quot; Mathematics of Operations Research, Vol. 15,</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<span class="comment">// 1990:430-466.</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="comment">// http://portal.acm.org/citation.cfm?id=92225</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">// Implementation issues are tackled in:</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">// A.V. Goldberg, &quot;An Efficient Implementation of a Scaling Minimum-Cost Flow</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">// Algorithm,&quot; Journal of Algorithms, (1997) 22:1-29</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment">// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.258</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment">// A.V. Goldberg and M. Kharitonov, &quot;On Implementing Scaling Push-Relabel</span></div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment">// Algorithms for the Minimum-Cost Flow Problem&quot;, Network flows and matching:</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment">// First DIMACS implementation challenge, DIMACS Series in Discrete Mathematics</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment">// and Theoretical Computer Science, (1993) 12:157-198.</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="comment">// ftp://dimacs.rutgers.edu/pub/netflow/submit/papers/Goldberg-mincost/scalmin.ps</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;<span class="comment">// and in:</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="comment">// U. Bunnagel, B. Korte, and J. Vygen. “Efficient implementation of the</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="comment">// Goldberg-Tarjan minimum-cost flow algorithm.” Optimization Methods and</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment">// Software (1998) vol. 10, no. 2:157-174.</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="comment">// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.84.9897</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;<span class="comment">// We have tried as much as possible in this implementation to keep the</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="comment">// notations and namings of the papers cited above, except for &#39;demand&#39; or</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="comment">// &#39;balance&#39; which have been replaced by &#39;supply&#39;, with the according sign</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;<span class="comment">// changes to better accommodate with the API of the rest of our tools. A demand</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="comment">// is denoted by a negative supply.</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="comment">// TODO(user): See whether the following can bring any improvements on real-life</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="comment">// problems.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="comment">// R.K. Ahuja, A.V. Goldberg, J.B. Orlin, and R.E. Tarjan, &quot;Finding minimum-cost</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="comment">// flows by double scaling,&quot; Mathematical Programming, (1992) 53:243-266.</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="comment">// http://www.springerlink.com/index/gu7404218u6kt166.pdf</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;<span class="comment">// An interesting general reference on network flows is:</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;<span class="comment">// R. K. Ahuja, T. L. Magnanti, J. B. Orlin, &quot;Network Flows: Theory, Algorithms,</span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment">// and Applications,&quot; Prentice Hall, 1993, ISBN: 978-0136175490,</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment">// http://www.amazon.com/dp/013617549X</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;<span class="comment">// Keywords: Push-relabel, min-cost flow, network, graph, Goldberg, Tarjan,</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;<span class="comment">// Dinic, Dinitz.</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="preprocessor">#ifndef OR_TOOLS_GRAPH_MIN_COST_FLOW_H_</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;<span class="preprocessor">#define OR_TOOLS_GRAPH_MIN_COST_FLOW_H_</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; </div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="preprocessor">#include &lt;stack&gt;</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="preprocessor">#include &quot;ortools/base/integral_types.h&quot;</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="preprocessor">#include &quot;ortools/base/logging.h&quot;</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="preprocessor">#include &quot;ortools/base/macros.h&quot;</span></div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ebert__graph_8h.html">ortools/graph/ebert_graph.h</a>&quot;</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="graph_8h.html">ortools/graph/graph.h</a>&quot;</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor">#include &quot;ortools/util/stats.h&quot;</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="preprocessor">#include &quot;ortools/util/zvector.h&quot;</span></div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceoperations__research.html">operations_research</a> {</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; </div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="comment">// Forward declaration.</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Graph, <span class="keyword">typename</span> ArcFlowType, <span class="keyword">typename</span> ArcScaledCostType&gt;</div>
<div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html"> 188</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1GenericMinCostFlow.html">GenericMinCostFlow</a>;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; </div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="comment">// Different statuses for a solved problem.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;<span class="comment">// We use a base class to share it between our different interfaces.</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html"> 192</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1MinCostFlowBase.html">MinCostFlowBase</a> {</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b"> 194</a></span>&#160; <span class="keyword">enum</span> <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> {</div>
<div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba0e6873a155f86a4695f463bf8601d05f"> 195</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba0e6873a155f86a4695f463bf8601d05f">NOT_SOLVED</a>,</div>
<div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2579881e7c83261bc21bafb5a5c92cad"> 196</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2579881e7c83261bc21bafb5a5c92cad">OPTIMAL</a>,</div>
<div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1"> 197</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">FEASIBLE</a>,</div>
<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483"> 198</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">INFEASIBLE</a>,</div>
<div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba6a2175a75814f119266396a0e9681718"> 199</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba6a2175a75814f119266396a0e9681718">UNBALANCED</a>,</div>
<div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac76ecfd837bdc6d4150bb02c403356e4"> 200</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac76ecfd837bdc6d4150bb02c403356e4">BAD_RESULT</a>,</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac4a203c4d1b6ee01ef2494cf7bc90e88">BAD_COST_RANGE</a></div>
<div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac4a203c4d1b6ee01ef2494cf7bc90e88"> 202</a></span>&#160; };</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;};</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="comment">// A simple and efficient min-cost flow interface. This is as fast as</span></div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;<span class="comment">// GenericMinCostFlow&lt;ReverseArcStaticGraph&gt;, which is the fastest, but is uses</span></div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="comment">// more memory in order to hide the somewhat involved construction of the</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="comment">// static graph.</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="comment">// TODO(user): If the need arises, extend this interface to support warm start</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="comment">// and incrementality between solves. Note that this is already supported by the</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="comment">// GenericMinCostFlow&lt;&gt; interface.</span></div>
<div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html"> 213</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html">SimpleMinCostFlow</a> : <span class="keyword">public</span> <a class="code" href="classoperations__research_1_1MinCostFlowBase.html">MinCostFlowBase</a> {</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="comment">// By default, the constructor takes no size. New node indices are created</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="comment">// lazily by AddArcWithCapacityAndUnitCost() or SetNodeSupply() such that the</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// set of valid nodes will always be [0, NumNodes()).</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="comment">// You may pre-reserve the internal data structures with a given expected</span></div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="comment">// number of nodes and arcs, to potentially gain performance.</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a6d65a7ab08c98b332781f187776683e5"> 221</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a6d65a7ab08c98b332781f187776683e5">SimpleMinCostFlow</a>(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> reserve_num_nodes = 0,</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> reserve_num_arcs = 0);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="comment">// Adds a directed arc from tail to head to the underlying graph with</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="comment">// a given capacity and cost per unit of flow.</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="comment">// * Node indices and the capacity must be non-negative (&gt;= 0).</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="comment">// * The unit cost can take any integer value (even negative).</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="comment">// * Self-looping and duplicate arcs are supported.</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="comment">// * After the method finishes, NumArcs() == the returned ArcIndex + 1.</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a20e10ea36c32c30c5130f300f1ffde2e"> 230</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a20e10ea36c32c30c5130f300f1ffde2e">AddArcWithCapacityAndUnitCost</a>(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> tail, <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> head,</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> capacity,</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> unit_cost);</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; </div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="comment">// Sets the supply of the given node. The node index must be non-negative (&gt;=</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="comment">// 0). Nodes implicitly created will have a default supply set to 0. A demand</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="comment">// is modeled as a negative supply.</span></div>
<div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c"> 237</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c">SetNodeSupply</a>(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node, <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> supply);</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; </div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="comment">// Solves the problem, and returns the problem status. This function</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="comment">// requires that the sum of all node supply minus node demand is zero and</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// that the graph has enough capacity to send all supplies and serve all</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="comment">// demands. Otherwise, it will return INFEASIBLE.</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#acc2868367f8fd38360a8b5b56cf71bdc"> 243</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#acc2868367f8fd38360a8b5b56cf71bdc">Solve</a>() {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">return</span> SolveWithPossibleAdjustment(SupplyAdjustment::DONT_ADJUST);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; }</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; </div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// Same as Solve(), but does not have the restriction that the supply</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="comment">// must match the demand or that the graph has enough capacity to serve</span></div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="comment">// all the demand or use all the supply. This will compute a maximum-flow</span></div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">// with minimum cost. The value of the maximum-flow will be given by</span></div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">// MaximumFlow().</span></div>
<div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a296c6f72aa7e3127a851efabcf109a2b"> 252</a></span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a296c6f72aa7e3127a851efabcf109a2b">SolveMaxFlowWithMinCost</a>() {</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">return</span> SolveWithPossibleAdjustment(SupplyAdjustment::ADJUST);</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; }</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; </div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="comment">// Returns the cost of the minimum-cost flow found by the algorithm when</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">// the returned Status is OPTIMAL.</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#ad39ce7ee10c34a3ce1f69f179aa4f1e9"> 258</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#ad39ce7ee10c34a3ce1f69f179aa4f1e9">OptimalCost</a>() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; </div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="comment">// Returns the total flow of the minimum-cost flow found by the algorithm</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// when the returned Status is OPTIMAL.</span></div>
<div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a3351fc1eb1dce4a7f6b937db874b5de1"> 262</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a3351fc1eb1dce4a7f6b937db874b5de1">MaximumFlow</a>() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// Returns the flow on arc, this only make sense for a successful Solve().</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// Note: It is possible that there is more than one optimal solution. The</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// algorithm is deterministic so it will always return the same solution for</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="comment">// a given problem. However, there is no guarantee of this from one code</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// version to the next (but the code does not change often).</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93"> 270</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93">Flow</a>(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// Accessors for the user given data. The implementation will crash if &quot;arc&quot;</span></div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// is not in [0, NumArcs()) or &quot;node&quot; is not in [0, NumNodes()).</span></div>
<div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a3be0f6fcc44bc6a4a1e976c1e60b31d0"> 274</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a3be0f6fcc44bc6a4a1e976c1e60b31d0">NumNodes</a>() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a7898be8b7efbfe53a58fcf621cf41315"> 275</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a7898be8b7efbfe53a58fcf621cf41315">NumArcs</a>() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#ab49dbdb731f80e626e575bdf66835f46"> 276</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#ab49dbdb731f80e626e575bdf66835f46">Tail</a>(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00277"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#aa5f729a6274027e5e5478e4bd76603ca"> 277</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#aa5f729a6274027e5e5478e4bd76603ca">Head</a>(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a9dcd8610149406a1593d2a0725290482"> 278</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a9dcd8610149406a1593d2a0725290482">Capacity</a>(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00279"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7"> 279</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7">Supply</a>(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"><a class="line" href="classoperations__research_1_1SimpleMinCostFlow.html#a1057f1a98821c9237d75967b575f3829"> 280</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> <a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html#a1057f1a98821c9237d75967b575f3829">UnitCost</a>(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; </div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; typedef ::util::ReverseArcStaticGraph&lt;NodeIndex, ArcIndex&gt; <a class="code" href="classutil_1_1ReverseArcStaticGraph.html">Graph</a>;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keyword">enum</span> SupplyAdjustment { ADJUST, DONT_ADJUST };</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; </div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="comment">// Applies the permutation in arc_permutation_ to the given arc index.</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> PermutedArc(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc);</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// Solves the problem, potentially applying supply and demand adjustment,</span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// and returns the problem status.</span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <a class="code" href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> SolveWithPossibleAdjustment(SupplyAdjustment adjustment);</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordtype">void</span> ResizeNodeVectors(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node);</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; </div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; std::vector&lt;NodeIndex&gt; arc_tail_;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; std::vector&lt;NodeIndex&gt; arc_head_;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; std::vector&lt;FlowQuantity&gt; arc_capacity_;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; std::vector&lt;FlowQuantity&gt; node_supply_;</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; std::vector&lt;CostValue&gt; arc_cost_;</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; std::vector&lt;ArcIndex&gt; arc_permutation_;</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; std::vector&lt;FlowQuantity&gt; arc_flow_;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> optimal_cost_;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> maximum_flow_;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; DISALLOW_COPY_AND_ASSIGN(<a class="code" href="classoperations__research_1_1SimpleMinCostFlow.html">SimpleMinCostFlow</a>);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;};</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; </div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;<span class="comment">// Generic MinCostFlow that works with StarGraph and all the graphs handling</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;<span class="comment">// reverse arcs from graph.h, see the end of min_cost_flow.cc for the exact</span></div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;<span class="comment">// types this class is compiled for.</span></div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;<span class="comment">// One can greatly decrease memory usage by using appropriately small integer</span></div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;<span class="comment">// types:</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;<span class="comment">// - For the Graph&lt;&gt; types, i.e. NodeIndexType and ArcIndexType, see graph.h.</span></div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;<span class="comment">// - ArcFlowType is used for the *per-arc* flow quantity. It must be signed, and</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160;<span class="comment">// large enough to hold the maximum arc capacity and its negation.</span></div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;<span class="comment">// - ArcScaledCostType is used for a per-arc scaled cost. It must be signed</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;<span class="comment">// and large enough to hold the maximum unit cost of an arc times</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;<span class="comment">// (num_nodes + 1).</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;<span class="comment">// Note that the latter two are different than FlowQuantity and CostValue, which</span></div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;<span class="comment">// are used for global, aggregated values and may need to be larger.</span></div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;<span class="comment">//</span></div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;<span class="comment">// TODO(user): Avoid using the globally defined type CostValue and FlowQuantity.</span></div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160;<span class="comment">// Also uses the Arc*Type where there is no risk of overflow in more places.</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> <a class="code" href="namespaceutil.html#a2f76166dbe0c4055a1f256235ad00478">Graph</a>, <span class="keyword">typename</span> ArcFlowType = <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a>,</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keyword">typename</span> ArcScaledCostType = <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a>&gt;</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;<span class="keyword">class </span>GenericMinCostFlow : <span class="keyword">public</span> MinCostFlowBase {</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf"> 328</a></span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">Graph::NodeIndex</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a>;</div>
<div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48"> 329</a></span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">Graph::ArcIndex</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a>;</div>
<div class="line"><a name="l00330"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a0d012d3907b8306ddfc1a7089342fbe2"> 330</a></span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> Graph::OutgoingArcIterator <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a0d012d3907b8306ddfc1a7089342fbe2">OutgoingArcIterator</a>;</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> Graph::OutgoingOrOppositeIncomingArcIterator</div>
<div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a277838ded7171a604a67babdbea05988"> 332</a></span>&#160; <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a277838ded7171a604a67babdbea05988">OutgoingOrOppositeIncomingArcIterator</a>;</div>
<div class="line"><a name="l00333"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#ad2ab85b2912dbf12804d3d1ddea9ec15"> 333</a></span>&#160; <span class="keyword">typedef</span> ZVector&lt;ArcIndex&gt; <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#ad2ab85b2912dbf12804d3d1ddea9ec15">ArcIndexArray</a>;</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; </div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="comment">// Initialize a MinCostFlow instance on the given graph. The graph does not</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="comment">// need to be fully built yet, but its capacity reservation is used to</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="comment">// initialize the memory of this class.</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a34e6d785d3dc22ee8d54bad8f1cf6cc2"> 338</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a34e6d785d3dc22ee8d54bad8f1cf6cc2">GenericMinCostFlow</a>(<span class="keyword">const</span> <a class="code" href="namespaceutil.html#a2f76166dbe0c4055a1f256235ad00478">Graph</a>* <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc">graph</a>);</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="comment">// Returns the graph associated to the current object.</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc"> 341</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceutil.html#a2f76166dbe0c4055a1f256235ad00478">Graph</a>* <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc">graph</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> graph_; }</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; </div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// Returns the status of last call to Solve(). NOT_SOLVED is returned if</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// Solve() has never been called or if the problem has been modified in such a</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="comment">// way that the previous solution becomes invalid.</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#adb1490a44086db009cdb51f854a02a65"> 346</a></span>&#160; Status <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#adb1490a44086db009cdb51f854a02a65">status</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> status_; }</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; </div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="comment">// Sets the supply corresponding to node. A demand is modeled as a negative</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// supply.</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c"> 350</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c">SetNodeSupply</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a> node, <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> supply);</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; </div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// Sets the unit cost for the given arc.</span></div>
<div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#ab7f4041c8667d63761aecb9657823945"> 353</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#ab7f4041c8667d63761aecb9657823945">SetArcUnitCost</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc, ArcScaledCostType unit_cost);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; </div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="comment">// Sets the capacity for the given arc.</span></div>
<div class="line"><a name="l00356"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#aeb6622ffa760bc9403144736f8ac4ad4"> 356</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#aeb6622ffa760bc9403144736f8ac4ad4">SetArcCapacity</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc, ArcFlowType new_capacity);</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; </div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">// Sets the flow for the given arc. Note that new_flow must be smaller than</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// the capacity of the arc.</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a89b020eea8abc71434d63071a1e38527"> 360</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a89b020eea8abc71434d63071a1e38527">SetArcFlow</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc, ArcFlowType new_flow);</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; </div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// Solves the problem, returning true if a min-cost flow could be found.</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a942f29030f08426e7e318204e987e2f7"> 363</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a942f29030f08426e7e318204e987e2f7">Solve</a>();</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; </div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="comment">// Checks for feasibility, i.e., that all the supplies and demands can be</span></div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="comment">// matched without exceeding bottlenecks in the network.</span></div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// If infeasible_supply_node (resp. infeasible_demand_node) are not NULL,</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="comment">// they are populated with the indices of the nodes where the initial supplies</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="comment">// (resp. demands) are too large. Feasible values for the supplies and</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="comment">// demands are accessible through FeasibleSupply.</span></div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="comment">// Note that CheckFeasibility is called by Solve() when the flag</span></div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="comment">// min_cost_flow_check_feasibility is set to true (which is the default.)</span></div>
<div class="line"><a name="l00373"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a92607deae80e69a2a63cc2d8f5205bd5"> 373</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a92607deae80e69a2a63cc2d8f5205bd5">CheckFeasibility</a>(std::vector&lt;NodeIndex&gt;* <span class="keyword">const</span> infeasible_supply_node,</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; std::vector&lt;NodeIndex&gt;* <span class="keyword">const</span> infeasible_demand_node);</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; </div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="comment">// Makes the min-cost flow problem solvable by truncating supplies and</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="comment">// demands to a level acceptable by the network. There may be several ways to</span></div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="comment">// do it. In our case, the levels are computed from the result of the max-flow</span></div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="comment">// algorithm run in CheckFeasibility().</span></div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// MakeFeasible returns false if CheckFeasibility() was not called before.</span></div>
<div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a3051a4b6d1a5a9fb5444f6d5a295a95c"> 381</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a3051a4b6d1a5a9fb5444f6d5a295a95c">MakeFeasible</a>();</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; </div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="comment">// Returns the cost of the minimum-cost flow found by the algorithm.</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#aa9b606016d2b0a38fed1e5c8acd818ed"> 384</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#aa9b606016d2b0a38fed1e5c8acd818ed">GetOptimalCost</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> total_flow_cost_; }</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; </div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="comment">// Returns the flow on the given arc using the equations given in the</span></div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// comment on residual_arc_capacity_.</span></div>
<div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93"> 388</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93">Flow</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; </div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// Returns the capacity of the given arc.</span></div>
<div class="line"><a name="l00391"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a9dcd8610149406a1593d2a0725290482"> 391</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a9dcd8610149406a1593d2a0725290482">Capacity</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; </div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// Returns the unscaled cost for the given arc.</span></div>
<div class="line"><a name="l00394"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a1057f1a98821c9237d75967b575f3829"> 394</a></span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a1057f1a98821c9237d75967b575f3829">UnitCost</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; </div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="comment">// Returns the supply at a given node. Demands are modelled as negative</span></div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="comment">// supplies.</span></div>
<div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7"> 398</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7">Supply</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; </div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// Returns the initial supply at a given node.</span></div>
<div class="line"><a name="l00401"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a84859dfe0d913de5132fd421bf5d002d"> 401</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a84859dfe0d913de5132fd421bf5d002d">InitialSupply</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; </div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="comment">// Returns the largest supply (if &gt; 0) or largest demand in absolute value</span></div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// (if &lt; 0) admissible at node. If the problem is not feasible, some of these</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="comment">// values will be smaller (in absolute value) than the initial supplies</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="comment">// and demand given as input.</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a27a137ef3b0fb7f787eb460dcfd52591"> 407</a></span>&#160; <a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a27a137ef3b0fb7f787eb460dcfd52591">FeasibleSupply</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; </div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="comment">// Whether to use the UpdatePrices() heuristic.</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#ae01fa6e52a98aee14eea54a935012ed0"> 410</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#ae01fa6e52a98aee14eea54a935012ed0">SetUseUpdatePrices</a>(<span class="keywordtype">bool</span> value) { use_price_update_ = value; }</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; </div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="comment">// Whether to check the feasibility of the problem with a max-flow, prior to</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="comment">// solving it. This uses about twice as much memory, but detects infeasible</span></div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// problems (where the flow can&#39;t be satisfied) and makes Solve() return</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="comment">// INFEASIBLE. If you disable this check, you will spare memory but you must</span></div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="comment">// make sure that your problem is feasible, otherwise the code can loop</span></div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="comment">// forever.</span></div>
<div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="classoperations__research_1_1GenericMinCostFlow.html#a74d8ec554b2414ab5f84d8d394b443ca"> 418</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a74d8ec554b2414ab5f84d8d394b443ca">SetCheckFeasibility</a>(<span class="keywordtype">bool</span> value) { check_feasibility_ = value; }</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// Returns true if the given arc is admissible i.e. if its residual capacity</span></div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// is strictly positive, and its reduced cost strictly negative, i.e., pushing</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">// more flow into it will result in a reduction of the total cost.</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordtype">bool</span> IsAdmissible(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordtype">bool</span> FastIsAdmissible(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc, <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> tail_potential) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; </div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// Returns true if node is active, i.e., if its supply is positive.</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordtype">bool</span> IsActive(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; </div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">// Returns the reduced cost for a given arc.</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> ReducedCost(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> FastReducedCost(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc, <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> tail_potential) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; </div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="comment">// Returns the first incident arc of a given node.</span></div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> GetFirstOutgoingOrOppositeIncomingArc(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; </div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="comment">// Checks the consistency of the input, i.e., whether the sum of the supplies</span></div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">// for all nodes is equal to zero. To be used in a DCHECK.</span></div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keywordtype">bool</span> CheckInputConsistency() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; </div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// Checks whether the result is valid, i.e. whether for each arc,</span></div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// residual_arc_capacity_[arc] == 0 || ReducedCost(arc) &gt;= -epsilon_.</span></div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="comment">// (A solution is epsilon-optimal if ReducedCost(arc) &gt;= -epsilon.)</span></div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="comment">// To be used in a DCHECK.</span></div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordtype">bool</span> CheckResult() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; </div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="comment">// Checks that the cost range fits in the range of int64&#39;s.</span></div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// To be used in a DCHECK.</span></div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordtype">bool</span> CheckCostRange() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; </div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">// Checks the relabel precondition (to be used in a DCHECK):</span></div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="comment">// - The node must be active, or have a 0 excess (relaxation for the Push</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="comment">// Look-Ahead heuristic).</span></div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="comment">// - The node must have no admissible arcs.</span></div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="keywordtype">bool</span> CheckRelabelPrecondition(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; </div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="comment">// Returns context concatenated with information about a given arc</span></div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// in a human-friendly way.</span></div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; std::string DebugString(<span class="keyword">const</span> std::string&amp; context, <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; </div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="comment">// Resets the first_admissible_arc_ array to the first incident arc of each</span></div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// node.</span></div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordtype">void</span> ResetFirstAdmissibleArcs();</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; </div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="comment">// Scales the costs, by multiplying them by (graph_-&gt;num_nodes() + 1).</span></div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordtype">void</span> ScaleCosts();</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; </div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">// Unscales the costs, by dividing them by (graph_-&gt;num_nodes() + 1).</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordtype">void</span> UnscaleCosts();</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; </div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="comment">// Optimizes the cost by dividing epsilon_ by alpha_ and calling Refine().</span></div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordtype">void</span> Optimize();</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; </div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">// Saturates the admissible arcs, i.e., push as much flow as possible.</span></div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keywordtype">void</span> SaturateAdmissibleArcs();</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; </div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="comment">// Pushes flow on a given arc, i.e., consumes flow on</span></div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">// residual_arc_capacity_[arc], and consumes -flow on</span></div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// residual_arc_capacity_[Opposite(arc)]. Updates node_excess_ at the tail</span></div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// and head of the arc accordingly.</span></div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordtype">void</span> PushFlow(<a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> flow, <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc);</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keywordtype">void</span> FastPushFlow(<a class="code" href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">FlowQuantity</a> flow, <a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc, <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> tail);</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; </div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// Initializes the stack active_nodes_.</span></div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordtype">void</span> InitializeActiveNodeStack();</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; </div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// Price update heuristics as described in A.V. Goldberg, &quot;An Efficient</span></div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="comment">// Implementation of a Scaling Minimum-Cost Flow Algorithm,&quot; Journal of</span></div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="comment">// Algorithms, (1997) 22:1-29</span></div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <span class="comment">// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.258</span></div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordtype">void</span> UpdatePrices();</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; </div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// Performs an epsilon-optimization step by saturating admissible arcs</span></div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="comment">// and discharging the active nodes.</span></div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="keywordtype">void</span> Refine();</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; </div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="comment">// Discharges an active node by saturating its admissible adjacent arcs,</span></div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="comment">// if any, and by relabelling it when it becomes inactive.</span></div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordtype">void</span> Discharge(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node);</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; </div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="comment">// Part of the Push LookAhead heuristic. When we are about to push on the</span></div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="comment">// in_arc, we check that the head (i.e node here) can accept the flow and</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">// return true if this is the case:</span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">// - Returns true if the node excess is &lt; 0.</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="comment">// - Returns true if node is an admissible arc at its current potential.</span></div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="comment">// - If the two conditions above are false, the node can be relabeled. We</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="comment">// do that and return true if the in_arc is still admissible.</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordtype">bool</span> LookAhead(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> in_arc, <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> in_tail_potential, <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node);</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; </div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="comment">// Relabels node, i.e., decreases its potential while keeping the</span></div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// epsilon-optimality of the pseudo flow. See CheckRelabelPrecondition() for</span></div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="comment">// details on the preconditions.</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordtype">void</span> Relabel(<a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> node);</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; </div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="comment">// Handy member functions to make the code more compact.</span></div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <a class="code" href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">NodeIndex</a> Head(<a class="code" href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">ArcIndex</a> arc)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> graph_-&gt;Head(arc); }</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">NodeIndex</a> Tail(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> graph_-&gt;Tail(arc); }</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> Opposite(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordtype">bool</span> IsArcDirect(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordtype">bool</span> IsArcValid(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">ArcIndex</a> arc) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; </div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="comment">// Pointer to the graph passed as argument.</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceutil.html#a2f76166dbe0c4055a1f256235ad00478">Graph</a>* graph_;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; </div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="comment">// An array representing the supply (if &gt; 0) or the demand (if &lt; 0)</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="comment">// for each node in graph_.</span></div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="namespaceoperations__research.html#a03fc0981d2d99da114ccd8b3abc0c6e1">QuantityArray</a> node_excess_;</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="comment">// An array representing the potential (or price function) for</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="comment">// each node in graph_.</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="namespaceoperations__research.html#acbdd6fd1484828a3d5e809c551ba8cf7">CostArray</a> node_potential_;</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; </div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="comment">// An array representing the residual_capacity for each arc in graph_.</span></div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="comment">// Residual capacities enable one to represent the capacity and flow for all</span></div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="comment">// arcs in the graph in the following manner.</span></div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="comment">// For all arcs, residual_arc_capacity_[arc] = capacity[arc] - flow[arc]</span></div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="comment">// Moreover, for reverse arcs, capacity[arc] = 0 by definition.</span></div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="comment">// Also flow[Opposite(arc)] = -flow[arc] by definition.</span></div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="comment">// Therefore:</span></div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="comment">// - for a direct arc:</span></div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="comment">// flow[arc] = 0 - flow[Opposite(arc)]</span></div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="comment">// = capacity[Opposite(arc)] - flow[Opposite(arc)]</span></div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// = residual_arc_capacity_[Opposite(arc)]</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="comment">// - for a reverse arc:</span></div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="comment">// flow[arc] = -residual_arc_capacity_[arc]</span></div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="comment">// Using these facts enables one to only maintain residual_arc_capacity_,</span></div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="comment">// instead of both capacity and flow, for each direct and indirect arc. This</span></div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="comment">// reduces the amount of memory for this information by a factor 2.</span></div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="comment">// Note that the sum of the largest capacity of an arc in the graph and of</span></div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="comment">// the total flow in the graph mustn&#39;t exceed the largest 64 bit integer</span></div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="comment">// to avoid errors. CheckInputConsistency() verifies this constraint.</span></div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; ZVector&lt;ArcFlowType&gt; residual_arc_capacity_;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; </div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="comment">// An array representing the first admissible arc for each node in graph_.</span></div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#ad2ab85b2912dbf12804d3d1ddea9ec15">ArcIndexArray</a> first_admissible_arc_;</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; </div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="comment">// A stack used for managing active nodes in the algorithm.</span></div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">// Note that the papers cited above recommend the use of a queue, but</span></div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="comment">// benchmarking so far has not proved it is better.</span></div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; std::stack&lt;NodeIndex&gt; active_nodes_;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; </div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="comment">// epsilon_ is the tolerance for optimality.</span></div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> epsilon_;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; </div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="comment">// alpha_ is the factor by which epsilon_ is divided at each iteration of</span></div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="comment">// Refine().</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keyword">const</span> int64 alpha_;</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; </div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="comment">// cost_scaling_factor_ is the scaling factor for cost.</span></div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> cost_scaling_factor_;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; </div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="comment">// An array representing the scaled unit cost for each arc in graph_.</span></div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; ZVector&lt;ArcScaledCostType&gt; scaled_arc_unit_cost_;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; </div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="comment">// The total cost of the flow.</span></div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <a class="code" href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">CostValue</a> total_flow_cost_;</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; </div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="comment">// The status of the problem.</span></div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; Status status_;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; </div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="comment">// An array containing the initial excesses (i.e. the supplies) for each</span></div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="comment">// node. This is used to create the max-flow-based feasibility checker.</span></div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <a class="code" href="namespaceoperations__research.html#a03fc0981d2d99da114ccd8b3abc0c6e1">QuantityArray</a> initial_node_excess_;</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; </div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="comment">// An array containing the best acceptable excesses for each of the</span></div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="comment">// nodes. These excesses are imposed by the result of the max-flow-based</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="comment">// feasibility checker for the nodes with an initial supply != 0. For the</span></div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="comment">// other nodes, the excess is simply 0.</span></div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <a class="code" href="namespaceoperations__research.html#a03fc0981d2d99da114ccd8b3abc0c6e1">QuantityArray</a> feasible_node_excess_;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; </div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="comment">// Statistics about this class.</span></div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; StatsGroup stats_;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; </div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="comment">// Number of Relabel() since last UpdatePrices().</span></div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordtype">int</span> num_relabels_since_last_price_update_;</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; </div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="comment">// A Boolean which is true when feasibility has been checked.</span></div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <span class="keywordtype">bool</span> feasibility_checked_;</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; </div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="comment">// Whether to use the UpdatePrices() heuristic.</span></div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordtype">bool</span> use_price_update_;</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; </div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="comment">// Whether to check the problem feasibility with a max-flow.</span></div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <span class="keywordtype">bool</span> check_feasibility_;</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; </div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; DISALLOW_COPY_AND_ASSIGN(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a34e6d785d3dc22ee8d54bad8f1cf6cc2">GenericMinCostFlow</a>);</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;};</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;<span class="preprocessor">#if !SWIG</span></div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; </div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="comment">// Default MinCostFlow instance that uses StarGraph.</span></div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment">// New clients should use SimpleMinCostFlow if they can.</span></div>
<div class="line"><a name="l00613"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlow.html"> 613</a></span>&#160;<span class="keyword">class </span><a class="code" href="classoperations__research_1_1MinCostFlow.html">MinCostFlow</a> : <span class="keyword">public</span> <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html">GenericMinCostFlow</a>&lt;StarGraph&gt; {</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00615"></a><span class="lineno"><a class="line" href="classoperations__research_1_1MinCostFlow.html#a6b237a92c15ebe2ebc6cce0e71d91b22"> 615</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classoperations__research_1_1MinCostFlow.html#a6b237a92c15ebe2ebc6cce0e71d91b22">MinCostFlow</a>(<span class="keyword">const</span> <a class="code" href="classoperations__research_1_1EbertGraph.html">StarGraph</a>* <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc">graph</a>) : <a class="code" href="classoperations__research_1_1GenericMinCostFlow.html">GenericMinCostFlow</a>(<a class="code" href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc">graph</a>) {}</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;};</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; </div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;<span class="preprocessor">#endif // SWIG</span></div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; </div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;} <span class="comment">// namespace operations_research</span></div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;<span class="preprocessor">#endif // OR_TOOLS_GRAPH_MIN_COST_FLOW_H_</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a0d012d3907b8306ddfc1a7089342fbe2"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a0d012d3907b8306ddfc1a7089342fbe2">operations_research::GenericMinCostFlow::OutgoingArcIterator</a></div><div class="ttdeci">Graph::OutgoingArcIterator OutgoingArcIterator</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00330">min_cost_flow.h:330</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a2a420ad8221c326064736ccf148d2f93"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93">operations_research::GenericMinCostFlow::Flow</a></div><div class="ttdeci">FlowQuantity Flow(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a84859dfe0d913de5132fd421bf5d002d"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a84859dfe0d913de5132fd421bf5d002d">operations_research::GenericMinCostFlow::InitialSupply</a></div><div class="ttdeci">FlowQuantity InitialSupply(NodeIndex node) const</div></div>
<div class="ttc" id="anamespaceoperations__research_html_a026ab0f83bfbeba2607959633753ff2e"><div class="ttname"><a href="namespaceoperations__research.html#a026ab0f83bfbeba2607959633753ff2e">operations_research::CostValue</a></div><div class="ttdeci">int64 CostValue</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00203">ebert_graph.h:203</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a7898be8b7efbfe53a58fcf621cf41315"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a7898be8b7efbfe53a58fcf621cf41315">operations_research::SimpleMinCostFlow::NumArcs</a></div><div class="ttdeci">ArcIndex NumArcs() const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_aa5f729a6274027e5e5478e4bd76603ca"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#aa5f729a6274027e5e5478e4bd76603ca">operations_research::SimpleMinCostFlow::Head</a></div><div class="ttdeci">NodeIndex Head(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a3be0f6fcc44bc6a4a1e976c1e60b31d0"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a3be0f6fcc44bc6a4a1e976c1e60b31d0">operations_research::SimpleMinCostFlow::NumNodes</a></div><div class="ttdeci">NodeIndex NumNodes() const</div></div>
<div class="ttc" id="anamespaceutil_html_a2f76166dbe0c4055a1f256235ad00478"><div class="ttname"><a href="namespaceutil.html#a2f76166dbe0c4055a1f256235ad00478">util::Graph</a></div><div class="ttdeci">ListGraph Graph</div><div class="ttdef"><b>Definition:</b> <a href="graph_8h_source.html#l02354">graph.h:2354</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a6d65a7ab08c98b332781f187776683e5"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a6d65a7ab08c98b332781f187776683e5">operations_research::SimpleMinCostFlow::SimpleMinCostFlow</a></div><div class="ttdeci">SimpleMinCostFlow(NodeIndex reserve_num_nodes=0, ArcIndex reserve_num_arcs=0)</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html">operations_research::SimpleMinCostFlow</a></div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00213">min_cost_flow.h:213</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a3351fc1eb1dce4a7f6b937db874b5de1"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a3351fc1eb1dce4a7f6b937db874b5de1">operations_research::SimpleMinCostFlow::MaximumFlow</a></div><div class="ttdeci">FlowQuantity MaximumFlow() const</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a3051a4b6d1a5a9fb5444f6d5a295a95c"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a3051a4b6d1a5a9fb5444f6d5a295a95c">operations_research::GenericMinCostFlow::MakeFeasible</a></div><div class="ttdeci">bool MakeFeasible()</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a1057f1a98821c9237d75967b575f3829"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a1057f1a98821c9237d75967b575f3829">operations_research::GenericMinCostFlow::UnitCost</a></div><div class="ttdeci">CostValue UnitCost(ArcIndex arc) const</div></div>
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdef"><b>Definition:</b> <a href="christofides_8h_source.html#l00033">christofides.h:33</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a44aa9e2f47277c91d8064c7126a2ff48"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a44aa9e2f47277c91d8064c7126a2ff48">operations_research::GenericMinCostFlow::ArcIndex</a></div><div class="ttdeci">Graph::ArcIndex ArcIndex</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00329">min_cost_flow.h:329</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_aeb6622ffa760bc9403144736f8ac4ad4"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#aeb6622ffa760bc9403144736f8ac4ad4">operations_research::GenericMinCostFlow::SetArcCapacity</a></div><div class="ttdeci">void SetArcCapacity(ArcIndex arc, ArcFlowType new_capacity)</div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70bac4a203c4d1b6ee01ef2494cf7bc90e88"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac4a203c4d1b6ee01ef2494cf7bc90e88">operations_research::MinCostFlowBase::BAD_COST_RANGE</a></div><div class="ttdeci">@ BAD_COST_RANGE</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00202">min_cost_flow.h:201</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a03fc0981d2d99da114ccd8b3abc0c6e1"><div class="ttname"><a href="namespaceoperations__research.html#a03fc0981d2d99da114ccd8b3abc0c6e1">operations_research::QuantityArray</a></div><div class="ttdeci">ZVector&lt; FlowQuantity &gt; QuantityArray</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00209">ebert_graph.h:209</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a4ddaeee9414a17257bb052c459325caf"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a4ddaeee9414a17257bb052c459325caf">operations_research::GenericMinCostFlow::NodeIndex</a></div><div class="ttdeci">Graph::NodeIndex NodeIndex</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00328">min_cost_flow.h:328</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a1057f1a98821c9237d75967b575f3829"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a1057f1a98821c9237d75967b575f3829">operations_research::SimpleMinCostFlow::UnitCost</a></div><div class="ttdeci">CostValue UnitCost(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a34e6d785d3dc22ee8d54bad8f1cf6cc2"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a34e6d785d3dc22ee8d54bad8f1cf6cc2">operations_research::GenericMinCostFlow::GenericMinCostFlow</a></div><div class="ttdeci">GenericMinCostFlow(const Graph *graph)</div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba2579881e7c83261bc21bafb5a5c92cad"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2579881e7c83261bc21bafb5a5c92cad">operations_research::MinCostFlowBase::OPTIMAL</a></div><div class="ttdeci">@ OPTIMAL</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00196">min_cost_flow.h:196</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a277838ded7171a604a67babdbea05988"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a277838ded7171a604a67babdbea05988">operations_research::GenericMinCostFlow::OutgoingOrOppositeIncomingArcIterator</a></div><div class="ttdeci">Graph::OutgoingOrOppositeIncomingArcIterator OutgoingOrOppositeIncomingArcIterator</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00332">min_cost_flow.h:332</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_acbdd6fd1484828a3d5e809c551ba8cf7"><div class="ttname"><a href="namespaceoperations__research.html#acbdd6fd1484828a3d5e809c551ba8cf7">operations_research::CostArray</a></div><div class="ttdeci">ZVector&lt; CostValue &gt; CostArray</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00210">ebert_graph.h:210</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html">operations_research::MinCostFlowBase</a></div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00192">min_cost_flow.h:192</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlow_html"><div class="ttname"><a href="classoperations__research_1_1MinCostFlow.html">operations_research::MinCostFlow</a></div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00613">min_cost_flow.h:613</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_ab7f4041c8667d63761aecb9657823945"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#ab7f4041c8667d63761aecb9657823945">operations_research::GenericMinCostFlow::SetArcUnitCost</a></div><div class="ttdeci">void SetArcUnitCost(ArcIndex arc, ArcScaledCostType unit_cost)</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_adb1490a44086db009cdb51f854a02a65"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#adb1490a44086db009cdb51f854a02a65">operations_research::GenericMinCostFlow::status</a></div><div class="ttdeci">Status status() const</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00346">min_cost_flow.h:346</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70bac76ecfd837bdc6d4150bb02c403356e4"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac76ecfd837bdc6d4150bb02c403356e4">operations_research::MinCostFlowBase::BAD_RESULT</a></div><div class="ttdeci">@ BAD_RESULT</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00200">min_cost_flow.h:200</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_aa9b606016d2b0a38fed1e5c8acd818ed"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#aa9b606016d2b0a38fed1e5c8acd818ed">operations_research::GenericMinCostFlow::GetOptimalCost</a></div><div class="ttdeci">CostValue GetOptimalCost() const</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00384">min_cost_flow.h:384</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_ab161c9ccc8667340cc3dc656d490f260"><div class="ttname"><a href="namespaceoperations__research.html#ab161c9ccc8667340cc3dc656d490f260">operations_research::FlowQuantity</a></div><div class="ttdeci">int64 FlowQuantity</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00202">ebert_graph.h:202</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1EbertGraph_html"><div class="ttname"><a href="classoperations__research_1_1EbertGraph.html">operations_research::EbertGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00188">ebert_graph.h:188</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a27a137ef3b0fb7f787eb460dcfd52591"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a27a137ef3b0fb7f787eb460dcfd52591">operations_research::GenericMinCostFlow::FeasibleSupply</a></div><div class="ttdeci">FlowQuantity FeasibleSupply(NodeIndex node) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a296c6f72aa7e3127a851efabcf109a2b"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a296c6f72aa7e3127a851efabcf109a2b">operations_research::SimpleMinCostFlow::SolveMaxFlowWithMinCost</a></div><div class="ttdeci">Status SolveMaxFlowWithMinCost()</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00252">min_cost_flow.h:252</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a942f29030f08426e7e318204e987e2f7"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a942f29030f08426e7e318204e987e2f7">operations_research::GenericMinCostFlow::Solve</a></div><div class="ttdeci">bool Solve()</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a2a420ad8221c326064736ccf148d2f93"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a2a420ad8221c326064736ccf148d2f93">operations_research::SimpleMinCostFlow::Flow</a></div><div class="ttdeci">FlowQuantity Flow(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_acc2868367f8fd38360a8b5b56cf71bdc"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#acc2868367f8fd38360a8b5b56cf71bdc">operations_research::SimpleMinCostFlow::Solve</a></div><div class="ttdeci">Status Solve()</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00243">min_cost_flow.h:243</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a9dcd8610149406a1593d2a0725290482"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a9dcd8610149406a1593d2a0725290482">operations_research::SimpleMinCostFlow::Capacity</a></div><div class="ttdeci">FlowQuantity Capacity(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_ad2ab85b2912dbf12804d3d1ddea9ec15"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#ad2ab85b2912dbf12804d3d1ddea9ec15">operations_research::GenericMinCostFlow::ArcIndexArray</a></div><div class="ttdeci">ZVector&lt; ArcIndex &gt; ArcIndexArray</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00333">min_cost_flow.h:333</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a89b020eea8abc71434d63071a1e38527"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a89b020eea8abc71434d63071a1e38527">operations_research::GenericMinCostFlow::SetArcFlow</a></div><div class="ttdeci">void SetArcFlow(ArcIndex arc, ArcFlowType new_flow)</div></div>
<div class="ttc" id="anamespaceoperations__research_html_ad90a9fc7d16bb2c98a088a4162bbbc9d"><div class="ttname"><a href="namespaceoperations__research.html#ad90a9fc7d16bb2c98a088a4162bbbc9d">operations_research::ArcIndex</a></div><div class="ttdeci">int32 ArcIndex</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00201">ebert_graph.h:201</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a74d8ec554b2414ab5f84d8d394b443ca"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a74d8ec554b2414ab5f84d8d394b443ca">operations_research::GenericMinCostFlow::SetCheckFeasibility</a></div><div class="ttdeci">void SetCheckFeasibility(bool value)</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00418">min_cost_flow.h:418</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_ab49dbdb731f80e626e575bdf66835f46"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#ab49dbdb731f80e626e575bdf66835f46">operations_research::SimpleMinCostFlow::Tail</a></div><div class="ttdeci">NodeIndex Tail(ArcIndex arc) const</div></div>
<div class="ttc" id="agraph_8h_html"><div class="ttname"><a href="graph_8h.html">graph.h</a></div></div>
<div class="ttc" id="aclassutil_1_1ReverseArcStaticGraph_html"><div class="ttname"><a href="classutil_1_1ReverseArcStaticGraph.html">util::ReverseArcStaticGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="graph_8h_source.html#l00547">graph.h:548</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a20e10ea36c32c30c5130f300f1ffde2e"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a20e10ea36c32c30c5130f300f1ffde2e">operations_research::SimpleMinCostFlow::AddArcWithCapacityAndUnitCost</a></div><div class="ttdeci">ArcIndex AddArcWithCapacityAndUnitCost(NodeIndex tail, NodeIndex head, FlowQuantity capacity, CostValue unit_cost)</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html">operations_research::GenericMinCostFlow</a></div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00188">min_cost_flow.h:188</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a272bcc4d6ee0e87a7fc430a5cb13c582"><div class="ttname"><a href="namespaceoperations__research.html#a272bcc4d6ee0e87a7fc430a5cb13c582">operations_research::NodeIndex</a></div><div class="ttdeci">int32 NodeIndex</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00200">ebert_graph.h:192</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlow_html_a6b237a92c15ebe2ebc6cce0e71d91b22"><div class="ttname"><a href="classoperations__research_1_1MinCostFlow.html#a6b237a92c15ebe2ebc6cce0e71d91b22">operations_research::MinCostFlow::MinCostFlow</a></div><div class="ttdeci">MinCostFlow(const StarGraph *graph)</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00615">min_cost_flow.h:615</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a10bcb8f7f63b390821ae5e95fe4822cc"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a10bcb8f7f63b390821ae5e95fe4822cc">operations_research::GenericMinCostFlow::graph</a></div><div class="ttdeci">const Graph * graph() const</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00341">min_cost_flow.h:341</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_ad39ce7ee10c34a3ce1f69f179aa4f1e9"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#ad39ce7ee10c34a3ce1f69f179aa4f1e9">operations_research::SimpleMinCostFlow::OptimalCost</a></div><div class="ttdeci">CostValue OptimalCost() const</div></div>
<div class="ttc" id="aebert__graph_8h_html"><div class="ttname"><a href="ebert__graph_8h.html">ebert_graph.h</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_ae01fa6e52a98aee14eea54a935012ed0"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#ae01fa6e52a98aee14eea54a935012ed0">operations_research::GenericMinCostFlow::SetUseUpdatePrices</a></div><div class="ttdeci">void SetUseUpdatePrices(bool value)</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00410">min_cost_flow.h:410</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba0e6873a155f86a4695f463bf8601d05f"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba0e6873a155f86a4695f463bf8601d05f">operations_research::MinCostFlowBase::NOT_SOLVED</a></div><div class="ttdeci">@ NOT_SOLVED</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00195">min_cost_flow.h:195</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a9dcd8610149406a1593d2a0725290482"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a9dcd8610149406a1593d2a0725290482">operations_research::GenericMinCostFlow::Capacity</a></div><div class="ttdeci">FlowQuantity Capacity(ArcIndex arc) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_aafd4139404e4f42af650481c3ff10cc7"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7">operations_research::SimpleMinCostFlow::Supply</a></div><div class="ttdeci">FlowQuantity Supply(NodeIndex node) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba2884fa43446c0cbc9c7a9b74d41d7483">operations_research::MinCostFlowBase::INFEASIBLE</a></div><div class="ttdeci">@ INFEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00198">min_cost_flow.h:198</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a7cd2dc0776a9f339b56ffac996a7df8c"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c">operations_research::GenericMinCostFlow::SetNodeSupply</a></div><div class="ttdeci">void SetNodeSupply(NodeIndex node, FlowQuantity supply)</div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_aafd4139404e4f42af650481c3ff10cc7"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#aafd4139404e4f42af650481c3ff10cc7">operations_research::GenericMinCostFlow::Supply</a></div><div class="ttdeci">FlowQuantity Supply(NodeIndex node) const</div></div>
<div class="ttc" id="aclassoperations__research_1_1SimpleMinCostFlow_html_a7cd2dc0776a9f339b56ffac996a7df8c"><div class="ttname"><a href="classoperations__research_1_1SimpleMinCostFlow.html#a7cd2dc0776a9f339b56ffac996a7df8c">operations_research::SimpleMinCostFlow::SetNodeSupply</a></div><div class="ttdeci">void SetNodeSupply(NodeIndex node, FlowQuantity supply)</div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba6a2175a75814f119266396a0e9681718"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba6a2175a75814f119266396a0e9681718">operations_research::MinCostFlowBase::UNBALANCED</a></div><div class="ttdeci">@ UNBALANCED</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00199">min_cost_flow.h:199</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1GenericMinCostFlow_html_a92607deae80e69a2a63cc2d8f5205bd5"><div class="ttname"><a href="classoperations__research_1_1GenericMinCostFlow.html#a92607deae80e69a2a63cc2d8f5205bd5">operations_research::GenericMinCostFlow::CheckFeasibility</a></div><div class="ttdeci">bool CheckFeasibility(std::vector&lt; NodeIndex &gt; *const infeasible_supply_node, std::vector&lt; NodeIndex &gt; *const infeasible_demand_node)</div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70b"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70b">operations_research::MinCostFlowBase::Status</a></div><div class="ttdeci">Status</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00194">min_cost_flow.h:194</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1MinCostFlowBase_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1"><div class="ttname"><a href="classoperations__research_1_1MinCostFlowBase.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba03f919221217f95d21a593a7120165e1">operations_research::MinCostFlowBase::FEASIBLE</a></div><div class="ttdeci">@ FEASIBLE</div><div class="ttdef"><b>Definition:</b> <a href="min__cost__flow_8h_source.html#l00197">min_cost_flow.h:197</a></div></div>
</div>
</div>
<div id="footer-container">
<div id="footer">
</div>
</div>
</body>
</html>