doc/graphs.tex
changeset 2 4c8956a7bdf4
equal deleted inserted replaced
-1:000000000000 0:35753634becd
       
     1 %* graphs.tex *%
       
     2 
       
     3 %***********************************************************************
       
     4 %  This code is part of GLPK (GNU Linear Programming Kit).
       
     5 %
       
     6 %  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
       
     7 %  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
       
     8 %  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
       
     9 %  E-mail: <mao@gnu.org>.
       
    10 %
       
    11 %  GLPK is free software: you can redistribute it and/or modify it
       
    12 %  under the terms of the GNU General Public License as published by
       
    13 %  the Free Software Foundation, either version 3 of the License, or
       
    14 %  (at your option) any later version.
       
    15 %
       
    16 %  GLPK is distributed in the hope that it will be useful, but WITHOUT
       
    17 %  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
       
    18 %  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
       
    19 %  License for more details.
       
    20 %
       
    21 %  You should have received a copy of the GNU General Public License
       
    22 %  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
       
    23 %***********************************************************************
       
    24 
       
    25 \documentclass[11pt]{report}
       
    26 \usepackage{amssymb}
       
    27 \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue,
       
    28 urlcolor=blue]{hyperref}
       
    29 \usepackage[all]{xy}
       
    30 
       
    31 \renewcommand\contentsname{\sf\bfseries Contents}
       
    32 \renewcommand\chaptername{\sf\bfseries Chapter}
       
    33 \renewcommand\appendixname{\sf\bfseries Appendix}
       
    34 
       
    35 \begin{document}
       
    36 
       
    37 \thispagestyle{empty}
       
    38 
       
    39 \begin{center}
       
    40 
       
    41 \vspace*{1in}
       
    42 
       
    43 \begin{huge}
       
    44 \sf\bfseries GNU Linear Programming Kit
       
    45 \end{huge}
       
    46 
       
    47 \vspace{0.5in}
       
    48 
       
    49 \begin{LARGE}
       
    50 \sf Graph and Network Routines
       
    51 \end{LARGE}
       
    52 
       
    53 \vspace{0.5in}
       
    54 
       
    55 \begin{LARGE}
       
    56 \sf for GLPK Version 4.45
       
    57 \end{LARGE}
       
    58 
       
    59 \vspace{0.5in}
       
    60 \begin{Large}
       
    61 \sf (DRAFT, December 2010)
       
    62 \end{Large}
       
    63 \end{center}
       
    64 
       
    65 \newpage
       
    66 
       
    67 \vspace*{1in}
       
    68 
       
    69 \vfill
       
    70 
       
    71 \noindent
       
    72 The GLPK package is part of the GNU Project released under the aegis of
       
    73 GNU.
       
    74 
       
    75 \medskip \noindent
       
    76 Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
       
    77 2008, 2009, 2010 Andrew Makhorin, Department for Applied Informatics,
       
    78 Moscow Aviation Institute, Moscow, Russia. All rights reserved.
       
    79 
       
    80 \medskip \noindent
       
    81 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
       
    82 02110-1301, USA.
       
    83 
       
    84 \medskip \noindent
       
    85 Permission is granted to make and distribute verbatim copies of this
       
    86 manual provided the copyright notice and this permission notice are
       
    87 preserved on all copies.
       
    88 
       
    89 \medskip \noindent
       
    90 Permission is granted to copy and distribute modified versions of this
       
    91 manual under the conditions for verbatim copying, provided also that the
       
    92 entire resulting derived work is distributed under the terms of
       
    93 a permission notice identical to this one.
       
    94 
       
    95 \medskip \noindent
       
    96 Permission is granted to copy and distribute translations of this manual
       
    97 into another language, under the above conditions for modified versions.
       
    98 
       
    99 \tableofcontents
       
   100 
       
   101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
   102 
       
   103 \chapter{Basic Graph API Routines}
       
   104 
       
   105 \section{Graph program object}
       
   106 
       
   107 In GLPK the base program object used to represent graphs and networks
       
   108 is a directed graph (digraph).
       
   109 
       
   110 Formally, {\it digraph} (or simply, {\it graph}) is a pair $G=(V,A)$,
       
   111 where $V$ is a set of {\it vertices}, and $A$ is a set
       
   112 {\it arcs}.\footnote{$A$ may be a multiset.} Each arc $a\in A$ is an
       
   113 ordered pair of vertices $a=(x,y)$, where $x\in V$ is called {\it tail
       
   114 vertex} of arc $a$, and $y\in V$ is called its {\it head vertex}.
       
   115 
       
   116 Representation of a graph in the program includes three structs defined
       
   117 by typedef in the header \verb|glpk.h|:
       
   118 
       
   119 \medskip
       
   120 
       
   121 $\bullet$ \verb|glp_graph|, which represents the graph in a whole,
       
   122 
       
   123 $\bullet$ \verb|glp_vertex|, which represents a vertex of the graph, and
       
   124 
       
   125 $\bullet$ \verb|glp_arc|, which represents an arc of the graph.
       
   126 
       
   127 \medskip
       
   128 
       
   129 All these three structs are ``semi-opaque'', i.e. the application
       
   130 program can directly access their fields through pointers, however,
       
   131 changing the fields directly is not allowed---all changes should be
       
   132 performed only with appropriate GLPK API routines.
       
   133 
       
   134 \newpage
       
   135 
       
   136 \newenvironment{comment}
       
   137 {\addtolength{\leftskip}{17pt}\noindent}
       
   138 {\par\addtolength{\leftskip}{-17pt}}
       
   139 
       
   140 \noindent
       
   141 {\bf glp\_graph.} The struct \verb|glp_graph| has the following
       
   142 fields available to the application program:
       
   143 
       
   144 \medskip
       
   145 
       
   146 \noindent
       
   147 \verb|char *name;|
       
   148 
       
   149 \begin{comment}Symbolic name assigned to the graph. It is a pointer to
       
   150 a null terminated character string of length from 1 to 255 characters.
       
   151 If no name is assigned to the graph, this field contains \verb|NULL|.
       
   152 \end{comment}
       
   153 
       
   154 \medskip
       
   155 
       
   156 \noindent
       
   157 \verb|int nv;|
       
   158 
       
   159 \begin{comment}The number of vertices in the graph, $nv\geq 0$.
       
   160 \end{comment}
       
   161 
       
   162 \medskip
       
   163 
       
   164 \noindent
       
   165 \verb|int na;|
       
   166 
       
   167 \begin{comment}The number of arcs in the graph, $na\geq 0$.
       
   168 \end{comment}
       
   169 
       
   170 \medskip
       
   171 
       
   172 \noindent
       
   173 \verb|glp_vertex **v;|
       
   174 
       
   175 \begin{comment}Pointer to an array containing the list of vertices.
       
   176 Element $v[0]$ is not used. Element $v[i]$, $1\leq i\leq nv$, is a
       
   177 pointer to $i$-th vertex of the graph. Note that on adding new vertices
       
   178 to the graph the field $v$ may be altered due to reallocation. However,
       
   179 pointers $v[i]$ are not changed while corresponding vertices exist in
       
   180 the graph.
       
   181 \end{comment}
       
   182 
       
   183 \medskip
       
   184 
       
   185 \noindent
       
   186 \verb|int v_size;|
       
   187 
       
   188 \begin{comment}Size of vertex data blocks, in bytes,
       
   189 $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct
       
   190 \verb|glp_vertex|.)
       
   191 \end{comment}
       
   192 
       
   193 \medskip
       
   194 
       
   195 \noindent
       
   196 \verb|int a_size;|
       
   197 
       
   198 \begin{comment}Size of arc data blocks, in bytes,
       
   199 $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct
       
   200 \verb|glp_arc|.)
       
   201 \end{comment}
       
   202 
       
   203 \bigskip
       
   204 
       
   205 \noindent
       
   206 {\bf glp\_vertex.} The struct \verb|glp_vertex| has the following
       
   207 fields available to the application program:
       
   208 
       
   209 \medskip
       
   210 
       
   211 \noindent
       
   212 \verb|int i;|
       
   213 
       
   214 \begin{comment}Ordinal number of the vertex, $1\leq i\leq nv$. Note
       
   215 that element $v[i]$ in the struct \verb|glp_graph| points to the vertex,
       
   216 whose ordinal number is $i$.
       
   217 \end{comment}
       
   218 
       
   219 \medskip
       
   220 
       
   221 \noindent
       
   222 \verb|char *name;|
       
   223 
       
   224 \begin{comment}Symbolic name assigned to the vertex. It is a pointer to
       
   225 a null terminated character string of length from 1 to 255 characters.
       
   226 If no name is assigned to the vertex, this field contains \verb|NULL|.
       
   227 \end{comment}
       
   228 
       
   229 \medskip
       
   230 
       
   231 \noindent
       
   232 \verb|void *data;|
       
   233 
       
   234 \begin{comment}Pointer to a data block associated with the vertex. This
       
   235 data block is automatically allocated on creating a new vertex and freed
       
   236 on deleting the vertex. If $v\_size=0$, the block is not allocated, and
       
   237 this field contains \verb|NULL|.
       
   238 \end{comment}
       
   239 
       
   240 \medskip
       
   241 
       
   242 \noindent
       
   243 \verb|void *temp;|
       
   244 
       
   245 \begin{comment}Working pointer, which may be used freely for any
       
   246 purposes. The application program can change this field directly.
       
   247 \end{comment}
       
   248 
       
   249 \medskip
       
   250 
       
   251 \noindent
       
   252 \verb|glp_arc *in;|
       
   253 
       
   254 \begin{comment}Pointer to the (unordered) list of incoming arcs. If the
       
   255 vertex has no incoming arcs, this field contains \verb|NULL|.
       
   256 \end{comment}
       
   257 
       
   258 \medskip
       
   259 
       
   260 \noindent
       
   261 \verb|glp_arc *out;|
       
   262 
       
   263 \begin{comment}Pointer to the (unordered) list of outgoing arcs. If the
       
   264 vertex has no outgoing arcs, this field contains \verb|NULL|.
       
   265 \end{comment}
       
   266 
       
   267 \bigskip
       
   268 
       
   269 \noindent
       
   270 {\bf glp\_arc.} The struct \verb|glp_arc| has the following fields
       
   271 available to the application program:
       
   272 
       
   273 \medskip
       
   274 
       
   275 \noindent
       
   276 \verb|glp_vertex *tail;|
       
   277 
       
   278 \begin{comment}Pointer to a vertex, which is tail endpoint of the arc.
       
   279 \end{comment}
       
   280 
       
   281 \medskip
       
   282 
       
   283 \noindent
       
   284 \verb|glp_vertex *head;|
       
   285 
       
   286 \begin{comment}Pointer to a vertex, which is head endpoint of the arc.
       
   287 \end{comment}
       
   288 
       
   289 \medskip
       
   290 
       
   291 \noindent
       
   292 \verb|void *data;|
       
   293 
       
   294 \begin{comment}Pointer to a data block associated with the arc. This
       
   295 data block is automatically allocated on creating a new arc and freed on
       
   296 deleting the arc. If $v\_size=0$, the block is not allocated, and this
       
   297 field contains \verb|NULL|.
       
   298 \end{comment}
       
   299 
       
   300 \medskip
       
   301 
       
   302 \noindent
       
   303 \verb|void *temp;|
       
   304 
       
   305 \begin{comment}Working pointer, which may be used freely for any
       
   306 purposes. The application program can change this field directly.
       
   307 \end{comment}
       
   308 
       
   309 \medskip
       
   310 
       
   311 \noindent
       
   312 \verb|glp_arc *t_next;|
       
   313 
       
   314 \begin{comment}Pointer to another arc, which has the same tail endpoint
       
   315 as this one. \verb|NULL| in this field indicates the end of the list of
       
   316 outgoing arcs.
       
   317 \end{comment}
       
   318 
       
   319 \medskip
       
   320 
       
   321 \noindent
       
   322 \verb|glp_arc *h_next;|
       
   323 
       
   324 \begin{comment}Pointer to another arc, which has the same head endpoint
       
   325 as this one. \verb|NULL| in this field indicates the end of the list of
       
   326 incoming arcs.
       
   327 \end{comment}
       
   328 
       
   329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
   330 
       
   331 \newpage
       
   332 
       
   333 \section{Graph creating and modifying routines}
       
   334 
       
   335 \subsection{glp\_create\_graph---create graph}
       
   336 
       
   337 \subsubsection*{Synopsis}
       
   338 
       
   339 \begin{verbatim}
       
   340 glp_graph *glp_create_graph(int v_size, int a_size);
       
   341 \end{verbatim}
       
   342 
       
   343 \subsubsection*{Description}
       
   344 
       
   345 The routine \verb|glp_create_graph| creates a new graph, which
       
   346 initially is\linebreak empty, i.e. has no vertices and arcs.
       
   347 
       
   348 The parameter \verb|v_size| specifies the size of vertex data blocks,
       
   349 in bytes, $0\leq v\_size\leq 256$.
       
   350 
       
   351 The parameter \verb|a_size| specifies the size of arc data blocks, in
       
   352 bytes, $0\leq a\_size\leq 256$.
       
   353 
       
   354 \subsubsection*{Returns}
       
   355 
       
   356 The routine returns a pointer to the graph created.
       
   357 
       
   358 \subsection{glp\_set\_graph\_name---assign (change) graph name}
       
   359 
       
   360 \subsubsection*{Synopsis}
       
   361 
       
   362 \begin{verbatim}
       
   363 void glp_set_graph_name(glp_graph *G, const char *name);
       
   364 \end{verbatim}
       
   365 
       
   366 \subsubsection*{Description}
       
   367 
       
   368 The routine \verb|glp_set_graph_name| assigns a symbolic name specified
       
   369 by the character string \verb|name| (1 to 255 chars) to the graph.
       
   370 
       
   371 If the parameter \verb|name| is \verb|NULL| or an empty string, the
       
   372 routine erases the existing symbolic name of the graph.
       
   373 
       
   374 \newpage
       
   375 
       
   376 \subsection{glp\_add\_vertices---add new vertices to graph}
       
   377 
       
   378 \subsubsection*{Synopsis}
       
   379 
       
   380 \begin{verbatim}
       
   381 int glp_add_vertices(glp_graph *G, int nadd);
       
   382 \end{verbatim}
       
   383 
       
   384 \subsubsection*{Description}
       
   385 
       
   386 The routine \verb|glp_add_vertices| adds \verb|nadd| vertices to the
       
   387 specified graph. New vertices are always added to the end of the vertex
       
   388 list, so ordinal numbers of existing vertices remain unchanged. Note
       
   389 that this operation may change the field \verb|v| in the struct
       
   390 \verb|glp_graph| (pointer to the vertex array) due to reallocation.
       
   391 
       
   392 Being added each new vertex is isolated, i.e. has no incident arcs.
       
   393 
       
   394 If the size of vertex data blocks specified on creating the graph is
       
   395 non-zero, the routine also allocates a memory block of that size for
       
   396 each new vertex added, fills it by binary zeros, and stores a pointer to
       
   397 it in the field \verb|data| of the struct \verb|glp_vertex|. Otherwise,
       
   398 if the block size is zero, the field \verb|data| is set to \verb|NULL|.
       
   399 
       
   400 \subsubsection*{Returns}
       
   401 
       
   402 The routine \verb|glp_add_vertices| returns the ordinal number of the
       
   403 first new vertex added to the graph.
       
   404 
       
   405 \subsection{glp\_set\_vertex\_name---assign (change) vertex name}
       
   406 
       
   407 \subsubsection*{Synopsis}
       
   408 
       
   409 \begin{verbatim}
       
   410 void glp_set_vertex_name(glp_graph *G, int i, const char *name);
       
   411 \end{verbatim}
       
   412 
       
   413 \subsubsection*{Description}
       
   414 
       
   415 The routine \verb|glp_set_vertex_name| assigns a given symbolic name
       
   416 (1 up to 255 characters) to \verb|i|-th vertex of the specified graph.
       
   417 
       
   418 If the parameter \verb|name| is \verb|NULL| or empty string, the
       
   419 routine erases an existing name of \verb|i|-th vertex.
       
   420 
       
   421 \newpage
       
   422 
       
   423 \subsection{glp\_add\_arc---add new arc to graph}
       
   424 
       
   425 \subsubsection*{Synopsis}
       
   426 
       
   427 \begin{verbatim}
       
   428 glp_arc *glp_add_arc(glp_graph *G, int i, int j);
       
   429 \end{verbatim}
       
   430 
       
   431 \subsubsection*{Description}
       
   432 
       
   433 The routine \verb|glp_add_arc| adds one new arc to the specified graph.
       
   434 
       
   435 The parameters \verb|i| and \verb|j| specify the ordinal numbers of,
       
   436 resp., tail and head endpoints (vertices) of the arc. Note that
       
   437 self-loops and multiple arcs are allowed.
       
   438 
       
   439 If the size of arc data blocks specified on creating the graph is
       
   440 non-zero, the routine also allocates a memory block of that size, fills
       
   441 it by binary zeros, and stores a pointer to it in the field \verb|data|
       
   442 of the struct \verb|glp_arc|. Otherwise, if the block size is zero, the
       
   443 field \verb|data| is set to \verb|NULL|.
       
   444 
       
   445 \subsection{glp\_del\_vertices---delete vertices from graph}
       
   446 
       
   447 \subsubsection*{Synopsis}
       
   448 
       
   449 \begin{verbatim}
       
   450 void glp_del_vertices(glp_graph *G, int ndel, const int num[]);
       
   451 \end{verbatim}
       
   452 
       
   453 \subsubsection*{Description}
       
   454 
       
   455 The routine \verb|glp_del_vertices| deletes vertices along with all
       
   456 incident arcs from the specified graph. Ordinal numbers of vertices to
       
   457 be deleted should be placed in locations \verb|num[1]|, \dots,
       
   458 \verb|num[ndel]|, \verb|ndel| $>0$.
       
   459 
       
   460 Note that deleting vertices involves changing ordinal numbers of other
       
   461 vertices remaining in the graph. New ordinal numbers of the remaining
       
   462 vertices are assigned under the assumption that the original order of
       
   463 vertices is not changed.
       
   464 
       
   465 \subsection{glp\_del\_arc---delete arc from graph}
       
   466 
       
   467 \subsubsection*{Synopsis}
       
   468 
       
   469 \begin{verbatim}
       
   470 void glp_del_arc(glp_graph *G, glp_arc *a);
       
   471 \end{verbatim}
       
   472 
       
   473 \subsubsection*{Description}
       
   474 
       
   475 The routine \verb|glp_del_arc| deletes an arc from the specified graph.
       
   476 The arc to be deleted must exist.
       
   477 
       
   478 \subsection{glp\_erase\_graph---erase graph content}
       
   479 
       
   480 \subsubsection*{Synopsis}
       
   481 
       
   482 \begin{verbatim}
       
   483 void glp_erase_graph(glp_graph *G, int v_size, int a_size);
       
   484 \end{verbatim}
       
   485 
       
   486 \subsubsection*{Description}
       
   487 
       
   488 The routine \verb|glp_erase_graph| erases the content of the specified
       
   489 graph. The effect of this operation is the same as if the graph would be
       
   490 deleted with the routine \verb|glp_delete_graph| and then created anew
       
   491 with the routine \verb|glp_create_graph|, with exception that the handle
       
   492 (pointer) to the graph remains valid.
       
   493 
       
   494 The parameters \verb|v_size| and \verb|a_size| have the same meaning as
       
   495 for the routine \verb|glp_create_graph|.
       
   496 
       
   497 \subsection{glp\_delete\_graph---delete graph}
       
   498 
       
   499 \subsubsection*{Synopsis}
       
   500 
       
   501 \begin{verbatim}
       
   502 void glp_delete_graph(glp_graph *G);
       
   503 \end{verbatim}
       
   504 
       
   505 \subsubsection*{Description}
       
   506 
       
   507 The routine \verb|glp_delete_graph| deletes the specified graph and
       
   508 frees all the memory allocated to this program object.
       
   509 
       
   510 \newpage
       
   511 
       
   512 \section{Graph searching routines}
       
   513 
       
   514 \subsection{glp\_create\_v\_index---create vertex name index}
       
   515 
       
   516 \subsubsection*{Synopsis}
       
   517 
       
   518 \begin{verbatim}
       
   519 void glp_create_v_index(glp_graph *G);
       
   520 \end{verbatim}
       
   521 
       
   522 \subsubsection*{Description}
       
   523 
       
   524 The routine \verb|glp_create_v_index| creates the name index for the
       
   525 specified graph. The name index is an auxiliary data structure, which
       
   526 is intended to quickly (i.e. for logarithmic time) find vertices by
       
   527 their names.
       
   528 
       
   529 This routine can be called at any time. If the name index already
       
   530 exists, the routine does nothing.
       
   531 
       
   532 \subsection{glp\_find\_vertex---find vertex by its name}
       
   533 
       
   534 \subsubsection*{Synopsis}
       
   535 
       
   536 \begin{verbatim}
       
   537 int glp_find_vertex(glp_graph *G, const char *name);
       
   538 \end{verbatim}
       
   539 
       
   540 \subsubsection*{Returns}
       
   541 
       
   542 The routine \verb|glp_find_vertex| returns the ordinal number of
       
   543 a vertex, which is assigned (by the routine \verb|glp_set_vertex_name|)
       
   544 the specified symbolic \verb|name|. If no such vertex exists, the
       
   545 routine returns 0.
       
   546 
       
   547 \subsection{glp\_delete\_v\_index---delete vertex name index}
       
   548 
       
   549 \subsubsection*{Synopsis}
       
   550 
       
   551 \begin{verbatim}
       
   552 void glp_delete_v_index(glp_graph *G);
       
   553 \end{verbatim}
       
   554 
       
   555 \subsubsection*{Description}
       
   556 
       
   557 The routine \verb|glp_delete_v_index| deletes the name index previously
       
   558 created by the routine \verb|glp_create_v_index| and frees the memory
       
   559 allocated to this auxiliary data structure.
       
   560 
       
   561 This routine can be called at any time. If the name index does not
       
   562 exist, the routine does nothing.
       
   563 
       
   564 \newpage
       
   565 
       
   566 \section{Graph reading/writing routines}
       
   567 
       
   568 \subsection{glp\_read\_graph---read graph from plain text file}
       
   569 
       
   570 \subsubsection*{Synopsis}
       
   571 
       
   572 \begin{verbatim}
       
   573 int glp_read_graph(glp_graph *G, const char *fname);
       
   574 \end{verbatim}
       
   575 
       
   576 \subsubsection*{Description}
       
   577 
       
   578 The routine \verb|glp_read_graph| reads a graph from a plain text file,
       
   579 whose name is specified by the parameter \verb|fname|. Note that before
       
   580 reading data the current content of the graph object is completely
       
   581 erased with the routine \verb|glp_erase_graph|.
       
   582 
       
   583 For the file format see description of the routine
       
   584 \verb|glp_write_graph|.
       
   585 
       
   586 \subsubsection*{Returns}
       
   587 
       
   588 If the operation was successful, the routine returns zero. Otherwise
       
   589 it prints an error message and returns non-zero.
       
   590 
       
   591 \subsection{glp\_write\_graph---write graph to plain text file}
       
   592 
       
   593 \subsubsection*{Synopsis}
       
   594 
       
   595 \begin{verbatim}
       
   596 int glp_write_graph(glp_graph *G, const char *fname);
       
   597 \end{verbatim}
       
   598 
       
   599 \subsubsection*{Description}
       
   600 
       
   601 The routine \verb|glp_write_graph| writes the graph to a plain text
       
   602 file, whose name is specified by the parameter \verb|fname|.
       
   603 
       
   604 \subsubsection*{Returns}
       
   605 
       
   606 If the operation was successful, the routine returns zero. Otherwise
       
   607 it prints an error message and returns non-zero.
       
   608 
       
   609 \subsubsection*{File format}
       
   610 
       
   611 The file created by the routine \verb|glp_write_graph| is a plain text
       
   612 file, which contains the following information:
       
   613 
       
   614 \begin{verbatim}
       
   615    nv na
       
   616    i[1] j[1]
       
   617    i[2] j[2]
       
   618    . . .
       
   619    i[na] j[na]
       
   620 \end{verbatim}
       
   621 
       
   622 \noindent
       
   623 where:
       
   624 
       
   625 \noindent
       
   626 \verb|nv| is the number of vertices (nodes);
       
   627 
       
   628 \noindent
       
   629 \verb|na| is the number of arcs;
       
   630 
       
   631 \noindent
       
   632 \verb|i[k]|, $k=1,\dots,na$, is the index of tail vertex of arc $k$;
       
   633 
       
   634 \noindent
       
   635 \verb|j[k]|, $k=1,\dots,na$, is the index of head vertex of arc $k$.
       
   636 
       
   637 \subsection{glp\_read\_ccdata---read graph from text file in DIMACS
       
   638 clique/coloring format}
       
   639 
       
   640 \subsubsection*{Synopsis}
       
   641 
       
   642 \begin{verbatim}
       
   643 int glp_read_ccdata(glp_graph *G, int v_wgt,
       
   644       const char *fname);
       
   645 \end{verbatim}
       
   646 
       
   647 \subsubsection*{Description}
       
   648 
       
   649 The routine {\it glp\_read\_ccdata} reads a graph from a text file in
       
   650 DIMACS clique/coloring format. (Though this format is originally
       
   651 designed to represent data for the minimal vertex coloring and maximal
       
   652 clique problems, it may be used to represent general undirected and
       
   653 directed graphs, because the routine allows reading self-loops and
       
   654 multiple edges/arcs keeping the order of vertices specified for each
       
   655 edge/arc of the graph.)
       
   656 
       
   657 The parameter $G$ specifies the graph object to be read in. Note that
       
   658 before reading data the current content of the graph object is
       
   659 completely erased with the routine {\it glp\_erase\_graph}.
       
   660 
       
   661 The parameter {\it v\_wgt} specifies an offset of the field of type
       
   662 {\bf double} in the vertex data block, to which the routine stores the
       
   663 vertex weight. If {\it v\_wgt} $<0$, the vertex weights are not stored.
       
   664 
       
   665 The character string {\it fname} specifies the name of a text file to
       
   666 be read in. (If the file name ends with the suffix `\verb|.gz|', the
       
   667 file is assumed to be compressed, in which case the routine decompresses
       
   668 it ``on the fly''.)
       
   669 
       
   670 \subsubsection*{Returns}
       
   671 
       
   672 If the operation was successful, the routine returns zero. Otherwise,
       
   673 it prints an error message and returns non-zero.
       
   674 
       
   675 \subsubsection*{DIMACS clique/coloring format\footnote{This material is
       
   676 based on the paper ``Clique and Coloring Problems Graph Format'', which
       
   677 is publically available at
       
   678 {\tt http://dimacs.rutgers.edu/Challenges/}.}}
       
   679 
       
   680 The DIMACS input file is a plain ASCII text file. It contains
       
   681 {\it lines} of several types described below. A line is terminated with
       
   682 an end-of-line character. Fields in each line are separated by at least
       
   683 one blank space. Each line begins with a one-character designator to
       
   684 identify the line type.
       
   685 
       
   686 Note that DIMACS requires all numerical quantities to be integers in
       
   687 the range $[-2^{31},2^{31}-1]$ while GLPK allows the quantities to be
       
   688 floating-point numbers.
       
   689 
       
   690 \paragraph{Comment lines.} Comment lines give human-readable information
       
   691 about the file and are ignored by programs. Comment lines can appear
       
   692 anywhere in the file. Each comment line begins with a lower-case
       
   693 character \verb|c|.
       
   694 
       
   695 \begin{verbatim}
       
   696    c This is a comment line
       
   697 \end{verbatim}
       
   698 
       
   699 \paragraph{Problem line.} There is one problem line per data file. The
       
   700 problem line must appear before any node or edge descriptor lines. It
       
   701 has the following format:
       
   702 
       
   703 \begin{verbatim}
       
   704    p edge NODES EDGES
       
   705 \end{verbatim}
       
   706 
       
   707 \noindent
       
   708 The lower-case letter \verb|p| signifies that this is a problem line.
       
   709 The four-character problem designator \verb|edge| identifies the file
       
   710 as containing data for the minimal vertex coloring or maximal clique
       
   711 problem. The \verb|NODES| field contains an integer value specifying
       
   712 the number of vertices in the graph. The \verb|EDGES| field contains an
       
   713 integer value specifying the number of edges (arcs) in the graph.
       
   714 
       
   715 \paragraph{Vertex descriptors.} These lines give the weight assigned to
       
   716 a vertex of the graph. There is one vertex descriptor line for each
       
   717 vertex, with the following format. Vertices without a descriptor take on
       
   718 a default value of 1.
       
   719 
       
   720 \begin{verbatim}
       
   721    n ID VALUE
       
   722 \end{verbatim}
       
   723 
       
   724 \noindent
       
   725 The lower-case character \verb|n| signifies that this is a vertex
       
   726 descriptor line. The \verb|ID| field gives a vertex identification
       
   727 number, an integer between 1 and $n$, where $n$ is the number of
       
   728 vertices in the graph. The \verb|VALUE| field gives a vertex weight,
       
   729 which can either positive or negative (or zero).
       
   730 
       
   731 \paragraph{Edge descriptors.} There is one edge descriptor line for
       
   732 each edge (arc) of the graph, each with the following format:
       
   733 
       
   734 \begin{verbatim}
       
   735    e I J
       
   736 \end{verbatim}
       
   737 
       
   738 \noindent
       
   739 The lower-case character \verb|e| signifies that this is an edge
       
   740 descriptor line. For an edge (arc) $(i,j)$ the fields \verb|I| and
       
   741 \verb|J| specify its endpoints.
       
   742 
       
   743 \paragraph{Example.} The following example of an undirected graph:
       
   744 
       
   745 \bigskip
       
   746 
       
   747 \noindent\hfil
       
   748 \xymatrix %@C=32pt
       
   749 {&{v_1}\ar@{-}[ldd]\ar@{-}[dd]\ar@{-}[rd]\ar@{-}[rr]&&{v_2}\ar@{-}[ld]
       
   750 \ar@{-}[dd]\ar@{-}[rdd]&\\
       
   751 &&{v_7}\ar@{-}[ld]\ar@{-}[rd]&&\\
       
   752 {v_6}\ar@{-}[r]\ar@{-}[rdd]&{v_{10}}\ar@{-}[rr]\ar@{-}[rd]\ar@{-}[dd]&&
       
   753 {v_8}\ar@{-}[ld]\ar@{-}[dd]\ar@{-}[r]&{v_3}\ar@{-}[ldd]\\
       
   754 &&{v_9}\ar@{-}[ld]\ar@{-}[rd]&&\\
       
   755 &{v_5}\ar@{-}[rr]&&{v_4}&\\
       
   756 }
       
   757 
       
   758 \bigskip
       
   759 
       
   760 \noindent
       
   761 might be coded in DIMACS clique/coloring format as follows:
       
   762 
       
   763 \begin{footnotesize}
       
   764 \begin{verbatim}
       
   765 c sample.col
       
   766 c
       
   767 c This is an example of the vertex coloring problem data
       
   768 c in DIMACS format.
       
   769 c
       
   770 p edge 10 21
       
   771 c
       
   772 e 1 2
       
   773 e 1 6
       
   774 e 1 7
       
   775 e 1 10
       
   776 e 2 3
       
   777 e 2 7
       
   778 e 2 8
       
   779 e 3 4
       
   780 e 3 8
       
   781 e 4 5
       
   782 e 4 8
       
   783 e 4 9
       
   784 e 5 6
       
   785 e 5 9
       
   786 e 5 10
       
   787 e 6 10
       
   788 e 7 8
       
   789 e 7 10
       
   790 e 8 9
       
   791 e 8 10
       
   792 e 9 10
       
   793 c
       
   794 c eof
       
   795 \end{verbatim}
       
   796 \end{footnotesize}
       
   797 
       
   798 \subsection{glp\_write\_ccdata---write graph to text file in DIMACS
       
   799 clique/coloring format}
       
   800 
       
   801 \subsubsection*{Synopsis}
       
   802 
       
   803 \begin{verbatim}
       
   804 int glp_write_ccdata(glp_graph *G, int v_wgt,
       
   805       const char *fname);
       
   806 \end{verbatim}
       
   807 
       
   808 \subsection*{Description}
       
   809 
       
   810 The routine {\it glp\_write\_ccdata} writes the graph object specified
       
   811 by the parameter $G$ to a text file in DIMACS clique/coloring format.
       
   812 (Though this format is originally designed to represent data for the
       
   813 minimal vertex coloring and maximal clique problems, it may be used to
       
   814 represent general undirected and directed graphs, because the routine
       
   815 allows writing self-loops and multiple edges/arcs keeping the order of
       
   816 vertices specified for each edge/arc of the graph.)
       
   817 
       
   818 The parameter {\it v\_wgt} specifies an offset of the field of type
       
   819 {\bf double} in the vertex data block, which contains the vertex weight.
       
   820 If {\it v\_wgt} $<0$, it is assumed that the weight of each vertex is 1.
       
   821 
       
   822 The character string {\it fname} specifies a name of the text file to be
       
   823 written out. (If the file name ends with suffix `\verb|.gz|', the file
       
   824 is assumed to be compressed, in which case the routine performs
       
   825 automatic compression on writing it.)
       
   826 
       
   827 \subsubsection*{Returns}
       
   828 
       
   829 If the operation was successful, the routine returns zero. Otherwise,
       
   830 it prints an error message and returns non-zero.
       
   831 
       
   832 \newpage
       
   833 
       
   834 \section{Graph analysis routines}
       
   835 
       
   836 \subsection{glp\_weak\_comp---find all weakly connected components of
       
   837 graph}
       
   838 
       
   839 \subsubsection*{Synopsis}
       
   840 
       
   841 \begin{verbatim}
       
   842 int glp_weak_comp(glp_graph *G, int v_num);
       
   843 \end{verbatim}
       
   844 
       
   845 \subsubsection*{Description}
       
   846 
       
   847 The routine \verb|glp_weak_comp| finds all weakly connected components
       
   848 of the specified graph.
       
   849 
       
   850 The parameter \verb|v_num| specifies an offset of the field of type
       
   851 \verb|int| in the vertex data block, to which the routine stores the
       
   852 number of a weakly connected component containing that vertex. If
       
   853 \verb|v_num| $<0$, no component numbers are stored.
       
   854 
       
   855 The components are numbered in arbitrary order from 1 to \verb|nc|,
       
   856 where \verb|nc| is the total number of components found,
       
   857 $0\leq$ \verb|nc| $\leq|V|$.
       
   858 
       
   859 \subsubsection*{Returns}
       
   860 
       
   861 The routine returns \verb|nc|, the total number of components found.
       
   862 
       
   863 \subsection{glp\_strong\_comp---find all strongly connected components
       
   864 of graph}
       
   865 
       
   866 \subsubsection*{Synopsis}
       
   867 
       
   868 \begin{verbatim}
       
   869 int glp_strong_comp(glp_graph *G, int v_num);
       
   870 \end{verbatim}
       
   871 
       
   872 \subsubsection*{Description}
       
   873 
       
   874 The routine \verb|glp_strong_comp| finds all strongly connected
       
   875 components of the specified graph.
       
   876 
       
   877 The parameter \verb|v_num| specifies an offset of the field of type
       
   878 \verb|int| in the vertex data block, to which the routine stores the
       
   879 number of a strongly connected component containing that vertex. If
       
   880 \verb|v_num| $<0$, no component numbers are stored.
       
   881 
       
   882 The components are numbered in arbitrary order from 1 to \verb|nc|,
       
   883 where \verb|nc| is the total number of components found,
       
   884 $0\leq$ \verb|nc| $\leq|V|$. However, the component numbering has the
       
   885 property that for every arc $(i\rightarrow j)$ in the graph the
       
   886 condition $num(i)\geq num(j)$ holds.
       
   887 
       
   888 \subsubsection*{Returns}
       
   889 
       
   890 The routine returns \verb|nc|, the total number of components found.
       
   891 
       
   892 \subsubsection*{References}
       
   893 
       
   894 I.~S.~Duff, J.~K.~Reid, Algorithm 529: Permutations to block triangular
       
   895 form, ACM Trans. on Math. Softw. 4 (1978), 189-92.
       
   896 
       
   897 \subsubsection*{Example}
       
   898 
       
   899 The following program reads a graph from a plain text file
       
   900 `\verb|graph.txt|' and finds all its strongly connected components.
       
   901 
       
   902 \begin{footnotesize}
       
   903 \begin{verbatim}
       
   904 #include <stddef.h>
       
   905 #include <stdio.h>
       
   906 #include <stdlib.h>
       
   907 #include <glpk.h>
       
   908 
       
   909 typedef struct { int num; } v_data;
       
   910 
       
   911 #define vertex(v) ((v_data *)((v)->data))
       
   912 
       
   913 int main(void)
       
   914 {     glp_graph *G;
       
   915       int i, nc;
       
   916       G = glp_create_graph(sizeof(v_data), 0);
       
   917       glp_read_graph(G, "graph.txt");
       
   918       nc = glp_strong_comp(G, offsetof(v_data, num));
       
   919       printf("nc = %d\n", nc);
       
   920       for (i = 1; i <= G->nv; i++)
       
   921          printf("num[%d] = %d\n", i, vertex(G->v[i])->num);
       
   922       glp_delete_graph(G);
       
   923       return 0;
       
   924 }
       
   925 \end{verbatim}
       
   926 \end{footnotesize}
       
   927 
       
   928 \noindent
       
   929 If the file `\verb|graph.txt|' contains the graph shown below:
       
   930 
       
   931 \bigskip
       
   932 
       
   933 \noindent\hfil
       
   934 \xymatrix
       
   935 {1\ar[r]&2\ar[r]&3\ar[r]\ar[dd]&4\ar[dd]\\
       
   936 5\ar[u]&6\ar[l]\\
       
   937 7\ar[u]&&8\ar[lu]\ar[ll]\ar[r]&9\ar[r]&10\ar[r]\ar[d]&11\ar[d]\\
       
   938 12\ar[u]\ar[rru]\ar@/_/[rr]&&13\ar[ll]\ar[u]\ar[rr]&&14\ar[lu]&15\ar[l]
       
   939 \\
       
   940 }
       
   941 
       
   942 \bigskip\bigskip
       
   943 
       
   944 \noindent
       
   945 the program output may look like follows:
       
   946 
       
   947 \begin{footnotesize}
       
   948 \begin{verbatim}
       
   949 Reading graph from `graph.txt'...
       
   950 Graph has 15 vertices and 30 arcs
       
   951 31 lines were read
       
   952 nc = 4
       
   953 num[1] = 3
       
   954 num[2] = 3
       
   955 num[3] = 3
       
   956 num[4] = 2
       
   957 num[5] = 3
       
   958 num[6] = 3
       
   959 num[7] = 3
       
   960 num[8] = 3
       
   961 num[9] = 1
       
   962 num[10] = 1
       
   963 num[11] = 1
       
   964 num[12] = 4
       
   965 num[13] = 4
       
   966 num[14] = 1
       
   967 num[15] = 1
       
   968 \end{verbatim}
       
   969 \end{footnotesize}
       
   970 
       
   971 \subsection{glp\_top\_sort---topological sorting of acyclic digraph}
       
   972 
       
   973 \subsubsection*{Synopsis}
       
   974 
       
   975 \begin{verbatim}
       
   976 int glp_top_sort(glp_graph *G, int v_num);
       
   977 \end{verbatim}
       
   978 
       
   979 \subsubsection*{Description}
       
   980 
       
   981 The routine \verb|glp_top_sort| performs topological sorting of
       
   982 vertices of the specified acyclic digraph.
       
   983 
       
   984 The parameter \verb|v_num| specifies an offset of the field of type
       
   985 \verb|int| in the vertex data block, to which the routine stores the
       
   986 vertex number assigned. If \verb|v_num| $<0$, vertex numbers are not
       
   987 stored.
       
   988 
       
   989 The vertices are numbered from 1 to $n$, where $n$ is the total number
       
   990 of vertices in the graph. The vertex numbering has the property that
       
   991 for every arc $(i\rightarrow j)$ in the graph the condition
       
   992 $num(i)<num(j)$ holds. Special case $num(i)=0$ means that vertex $i$ is
       
   993 not assigned a number, because the graph is {\it not} acyclic.
       
   994 
       
   995 \subsubsection*{Returns}
       
   996 
       
   997 If the graph is acyclic and therefore all the vertices have been
       
   998 assigned numbers, the routine \verb|glp_top_sort| returns zero.
       
   999 Otherwise, if the graph is not acyclic, the routine returns the number
       
  1000 of vertices which have not been numbered, i.e. for which $num(i)=0$.
       
  1001 
       
  1002 \subsubsection*{Example}
       
  1003 
       
  1004 The following program reads a digraph from a plain text file
       
  1005 `\verb|graph.txt|' and performs topological sorting of its vertices.
       
  1006 
       
  1007 \begin{footnotesize}
       
  1008 \begin{verbatim}
       
  1009 #include <stddef.h>
       
  1010 #include <stdio.h>
       
  1011 #include <stdlib.h>
       
  1012 #include <glpk.h>
       
  1013 
       
  1014 typedef struct { int num; } v_data;
       
  1015 
       
  1016 #define vertex(v) ((v_data *)((v)->data))
       
  1017 
       
  1018 int main(void)
       
  1019 {     glp_graph *G;
       
  1020       int i, cnt;
       
  1021       G = glp_create_graph(sizeof(v_data), 0);
       
  1022       glp_read_graph(G, "graph.txt");
       
  1023       cnt = glp_top_sort(G, offsetof(v_data, num));
       
  1024       printf("cnt = %d\n", cnt);
       
  1025       for (i = 1; i <= G->nv; i++)
       
  1026          printf("num[%d] = %d\n", i, vertex(G->v[i])->num);
       
  1027       glp_delete_graph(G);
       
  1028       return 0;
       
  1029 }
       
  1030 \end{verbatim}
       
  1031 \end{footnotesize}
       
  1032 
       
  1033 \noindent
       
  1034 If the file `\verb|graph.txt|' contains the graph shown below:
       
  1035 
       
  1036 \bigskip
       
  1037 
       
  1038 \noindent\hfil
       
  1039 \xymatrix @=20pt
       
  1040 {
       
  1041 1\ar[rrr]&&&2\ar[r]\ar[rddd]&3\ar[rd]&&&&\\
       
  1042 &&&4\ar[ru]&&5\ar[r]&6\ar[rd]\ar[dd]&&\\
       
  1043 7\ar[r]&8\ar[r]&9\ar[ruu]\ar[ru]\ar[r]\ar[rd]&10\ar[rr]\ar[rru]&&
       
  1044 11\ar[ru]&&12\ar[r]&13\\
       
  1045 &&&14\ar[r]&15\ar[rrru]\ar[rr]&&16\ar[rru]\ar[rr]&&17\\
       
  1046 }
       
  1047 
       
  1048 \bigskip\bigskip
       
  1049 
       
  1050 \noindent
       
  1051 the program output may look like follows:
       
  1052 
       
  1053 \begin{footnotesize}
       
  1054 \begin{verbatim}
       
  1055 Reading graph from `graph.txt'...
       
  1056 Graph has 17 vertices and 23 arcs
       
  1057 24 lines were read
       
  1058 cnt = 0
       
  1059 num[1] = 8
       
  1060 num[2] = 9
       
  1061 num[3] = 10
       
  1062 num[4] = 4
       
  1063 num[5] = 11
       
  1064 num[6] = 12
       
  1065 num[7] = 1
       
  1066 num[8] = 2
       
  1067 num[9] = 3
       
  1068 num[10] = 5
       
  1069 num[11] = 6
       
  1070 num[12] = 14
       
  1071 num[13] = 16
       
  1072 num[14] = 7
       
  1073 num[15] = 13
       
  1074 num[16] = 15
       
  1075 num[17] = 17
       
  1076 \end{verbatim}
       
  1077 \end{footnotesize}
       
  1078 
       
  1079 \noindent
       
  1080 The output corresponds to the following vertex numbering:
       
  1081 
       
  1082 \bigskip
       
  1083 
       
  1084 \noindent\hfil
       
  1085 \xymatrix @=20pt
       
  1086 {
       
  1087 8\ar[rrr]&&&9\ar[r]\ar[rddd]&10\ar[rd]&&&&\\
       
  1088 &&&4\ar[ru]&&11\ar[r]&12\ar[rd]\ar[dd]&&\\
       
  1089 1\ar[r]&2\ar[r]&3\ar[ruu]\ar[ru]\ar[r]\ar[rd]&5\ar[rr]\ar[rru]&&
       
  1090 6\ar[ru]&&14\ar[r]&16\\
       
  1091 &&&7\ar[r]&13\ar[rrru]\ar[rr]&&15\ar[rru]\ar[rr]&&17\\
       
  1092 }
       
  1093 
       
  1094 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
  1095 
       
  1096 \chapter{Network optimization API routines}
       
  1097 
       
  1098 \section{Minimum cost flow problem}
       
  1099 
       
  1100 \subsection{Background}
       
  1101 
       
  1102 The {\it minimum cost flow problem} (MCFP) is stated as follows. Let
       
  1103 there be given a directed graph (flow network) $G=(V,A)$, where $V$ is
       
  1104 a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs.
       
  1105 Let for each node $i\in V$ there be given a quantity $b_i$ having the
       
  1106 following meaning:
       
  1107 
       
  1108 if $b_i>0$, then $|b_i|$ is a {\it supply} at node $i$, which shows
       
  1109 how many flow units are {\it generated} at node $i$ (or, equivalently,
       
  1110 entering the network through node $i$ from the outside);
       
  1111 
       
  1112 if $b_i<0$, then $|b_i|$ is a {\it demand} at node $i$, which shows how
       
  1113 many flow units are {\it lost} at node $i$ (or, equivalently, leaving
       
  1114 the network through node $i$ to the outside);
       
  1115 
       
  1116 if $b_i=0$, then $i$ is a {\it transshipment} node, at which the flow
       
  1117 is conserved, i.e. neither generated nor lost.
       
  1118 
       
  1119 Let also for each arc $a=(i,j)\in A$ there be given the following three
       
  1120 quantities:
       
  1121 
       
  1122 $l_{ij}$, a (non-negative) lower bound to the flow through arc $(i,j)$;
       
  1123 
       
  1124 $u_{ij}$, an upper bound to the flow through arc $(i,j)$, which is the
       
  1125 {\it arc capacity};
       
  1126 
       
  1127 $c_{ij}$, a per-unit cost of the flow through arc $(i,j)$.
       
  1128 
       
  1129 The problem is to find flows $x_{ij}$ through every arc of the network,
       
  1130 which satisfy the specified bounds and the conservation constraints at
       
  1131 all nodes, and minimize the total flow cost. Here the conservation
       
  1132 constraint at a node means that the total flow entering this node
       
  1133 through its incoming arcs plus the supply at this node must be equal to
       
  1134 the total flow leaving this node through its outgoing arcs plus the
       
  1135 demand at this node.
       
  1136 
       
  1137 An example of the minimum cost flow problem is shown on Fig.~1.
       
  1138 
       
  1139 \bigskip
       
  1140 
       
  1141 \noindent\hfil
       
  1142 \xymatrix @C=48pt
       
  1143 {_{20}\ar@{~>}[d]&
       
  1144 v_2\ar[r]|{_{0,10,\$2}}\ar[dd]|{_{0,9,\$3}}&
       
  1145 v_3\ar[dd]|{_{2,12,\$1}}\ar[r]|{_{0,18,\$0}}&
       
  1146 v_8\ar[rd]|{_{0,20,\$9}}&\\
       
  1147 v_1\ar[ru]|{_{0,14,\$0}}\ar[rd]|{_{0,23,\$0}}&&&
       
  1148 v_6\ar[d]|{_{0,7,\$0}}\ar[u]|{_{4,8,\$0}}&
       
  1149 v_9\ar@{~>}[d]\\
       
  1150 &v_4\ar[r]|{_{0,26,\$0}}&
       
  1151 v_5\ar[luu]|{_{0,11,\$1}}\ar[ru]|{_{0,25,\$5}}\ar[r]|{_{0,4,\$7}}&
       
  1152 v_7\ar[ru]|{_{0,15,\$3}}&_{20}\\
       
  1153 }
       
  1154 
       
  1155 \medskip
       
  1156 
       
  1157 \noindent\hfil
       
  1158 \begin{tabular}{ccc}
       
  1159 \xymatrix @C=48pt{v_i\ar[r]|{\ l,u,\$c\ }&v_j\\}&
       
  1160 \xymatrix{\hbox{\footnotesize supply}\ar@{~>}[r]&v_i\\}&
       
  1161 \xymatrix{v_i\ar@{~>}[r]&\hbox{\footnotesize demand}\\}\\
       
  1162 \end{tabular}
       
  1163 
       
  1164 \bigskip
       
  1165 
       
  1166 \noindent\hfil
       
  1167 Fig.~1. An example of the minimum cost flow problem.
       
  1168 
       
  1169 \bigskip
       
  1170 
       
  1171 The minimum cost flow problem can be naturally formulated as the
       
  1172 following LP problem:
       
  1173 
       
  1174 \medskip
       
  1175 
       
  1176 \noindent
       
  1177 \hspace{.5in}minimize
       
  1178 $$z=\sum_{(i,j)\in A}c_{ij}x_{ij}\eqno(1)$$
       
  1179 \hspace{.5in}subject to
       
  1180 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=b_i\ \ \ \hbox
       
  1181 {for all}\ i\in V\eqno(2)$$
       
  1182 $$l_{ij}\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A
       
  1183 \eqno(3)$$
       
  1184 
       
  1185 \newpage
       
  1186 
       
  1187 \subsection{glp\_read\_mincost---read minimum cost flow problem\\data
       
  1188 in DIMACS format}
       
  1189 
       
  1190 \subsubsection*{Synopsis}
       
  1191 
       
  1192 \begin{verbatim}
       
  1193 int glp_read_mincost(glp_graph *G, int v_rhs, int a_low,
       
  1194       int a_cap, int a_cost, const char *fname);
       
  1195 \end{verbatim}
       
  1196 
       
  1197 \subsubsection*{Description}
       
  1198 
       
  1199 The routine \verb|glp_read_mincost| reads the minimum cost flow problem
       
  1200 data from a text file in DIMACS format.
       
  1201 
       
  1202 The parameter \verb|G| specifies the graph object, to which the problem
       
  1203 data have to be stored. Note that before reading data the current
       
  1204 content of the graph object is completely erased with the routine
       
  1205 \verb|glp_erase_graph|.
       
  1206 
       
  1207 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1208 \verb|double| in the vertex data block, to which the routine stores
       
  1209 $b_i$, the supply/demand value. If \verb|v_rhs| $<0$, the value is not
       
  1210 stored.
       
  1211 
       
  1212 The parameter \verb|a_low| specifies an offset of the field of type
       
  1213 \verb|double| in the arc data block, to which the routine stores
       
  1214 $l_{ij}$, the lower bound to the arc flow. If \verb|a_low| $<0$, the
       
  1215 lower bound is not stored.
       
  1216 
       
  1217 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1218 \verb|double| in the arc data block, to which the routine stores
       
  1219 $u_{ij}$, the upper bound to the arc flow (the arc capacity). If
       
  1220 \verb|a_cap| $<0$, the upper bound is not stored.
       
  1221 
       
  1222 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1223 \verb|double| in the arc data block, to which the routine stores
       
  1224 $c_{ij}$, the per-unit cost of the arc flow. If \verb|a_cost| $<0$, the
       
  1225 cost is not stored.
       
  1226 
       
  1227 The character string \verb|fname| specifies the name of a text file to
       
  1228 be read in. (If the file name name ends with the suffix `\verb|.gz|',
       
  1229 the file is assumed to be compressed, in which case the routine
       
  1230 decompresses it ``on the fly''.)
       
  1231 
       
  1232 \subsubsection*{Returns}
       
  1233 
       
  1234 If the operation was successful, the routine returns zero. Otherwise,
       
  1235 it prints an error message and returns non-zero.
       
  1236 
       
  1237 \newpage
       
  1238 
       
  1239 \subsubsection*{Example}
       
  1240 
       
  1241 \begin{footnotesize}
       
  1242 \begin{verbatim}
       
  1243 typedef struct
       
  1244 {     /* vertex data block */
       
  1245       ...
       
  1246       double rhs;
       
  1247       ...
       
  1248 } v_data;
       
  1249 
       
  1250 typedef struct
       
  1251 {     /* arc data block */
       
  1252       ...
       
  1253       double low, cap, cost;
       
  1254       ...
       
  1255 } a_data;
       
  1256 
       
  1257 int main(void)
       
  1258 {     glp_graph *G;
       
  1259       int ret;
       
  1260       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  1261       ret = glp_read_mincost(G, offsetof(v_data, rhs),
       
  1262          offsetof(a_data, low), offsetof(a_data, cap),
       
  1263          offsetof(a_data, cost), "sample.min");
       
  1264       if (ret != 0) goto ...
       
  1265       ...
       
  1266 }
       
  1267 \end{verbatim}
       
  1268 \end{footnotesize}
       
  1269 
       
  1270 \subsubsection*{DIMACS minimum cost flow problem format\footnote{This
       
  1271 material is based on the paper ``The First DIMACS International
       
  1272 Algorithm Implementation Challenge: Problem Definitions and
       
  1273 Specifications'', which is publically available at
       
  1274 {\tt http://dimacs.rutgers.edu/Challenges/}.}}
       
  1275 \label{subsecmincost}
       
  1276 
       
  1277 The DIMACS input file is a plain ASCII text file. It contains
       
  1278 {\it lines} of several types described below. A line is terminated with
       
  1279 an end-of-line character. Fields in each line are separated by at least
       
  1280 one blank space. Each line begins with a one-character designator to
       
  1281 identify the line type.
       
  1282 
       
  1283 Note that DIMACS requires all numerical quantities to be integers in
       
  1284 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be
       
  1285 floating-point numbers.
       
  1286 
       
  1287 \newpage
       
  1288 
       
  1289 \paragraph{Comment lines.} Comment lines give human-readable information
       
  1290 about the file and are ignored by programs. Comment lines can appear
       
  1291 anywhere in the file. Each comment line begins with a lower-case
       
  1292 character \verb|c|.
       
  1293 
       
  1294 \begin{verbatim}
       
  1295    c This is a comment line
       
  1296 \end{verbatim}
       
  1297 
       
  1298 \paragraph{Problem line.} There is one problem line per data file. The
       
  1299 problem line must appear before any node or arc descriptor lines. It has
       
  1300 the following format:
       
  1301 
       
  1302 \begin{verbatim}
       
  1303    p min NODES ARCS
       
  1304 \end{verbatim}
       
  1305 
       
  1306 \noindent
       
  1307 The lower-case character \verb|p| signifies that this is a problem line.
       
  1308 The three-character problem designator \verb|min| identifies the file as
       
  1309 containing specification information for the minimum cost flow problem.
       
  1310 The \verb|NODES| field contains an integer value specifying the number
       
  1311 of nodes in the network. The \verb|ARCS| field contains an integer value
       
  1312 specifying the number of arcs in the network.
       
  1313 
       
  1314 \paragraph{Node descriptors.} All node descriptor lines must appear
       
  1315 before all arc descriptor lines. The node descriptor lines describe
       
  1316 supply and demand nodes, but not transshipment nodes. That is, only
       
  1317 nodes with non-zero node supply/demand values appear. There is one node
       
  1318 descriptor line for each such node, with the following format:
       
  1319 
       
  1320 \begin{verbatim}
       
  1321    n ID FLOW
       
  1322 \end{verbatim}
       
  1323 
       
  1324 \noindent
       
  1325 The lower-case character \verb|n| signifies that this is a node
       
  1326 descriptor line. The \verb|ID| field gives a node identification number,
       
  1327 an integer between 1 and \verb|NODES|. The \verb|FLOW| field gives the
       
  1328 amount of supply (if positive) or demand (if negative) at node
       
  1329 \verb|ID|.
       
  1330 
       
  1331 \paragraph{Arc descriptors.} There is one arc descriptor line for each
       
  1332 arc in the network. Arc descriptor lines are of the following format:
       
  1333 
       
  1334 \begin{verbatim}
       
  1335    a SRC DST LOW CAP COST
       
  1336 \end{verbatim}
       
  1337 
       
  1338 \noindent
       
  1339 The lower-case character \verb|a| signifies that this is an arc
       
  1340 descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives
       
  1341 the identification number $i$ for the tail endpoint, and the \verb|DST|
       
  1342 field gives the identification number $j$ for the head endpoint.
       
  1343 Identification numbers are integers between 1 and \verb|NODES|. The
       
  1344 \verb|LOW| field specifies the minimum amount of flow that can be sent
       
  1345 along arc $(i,j)$, and the \verb|CAP| field gives the maximum amount of
       
  1346 flow that can be sent along arc $(i,j)$ in a feasible flow. The
       
  1347 \verb|COST| field contains the per-unit cost of flow sent along arc
       
  1348 $(i,j)$.
       
  1349 
       
  1350 \paragraph{Example.} Below here is an example of the data file in
       
  1351 DIMACS format corresponding to the minimum cost flow problem shown on
       
  1352 Fig~1.
       
  1353 
       
  1354 \begin{footnotesize}
       
  1355 \begin{verbatim}
       
  1356 c sample.min
       
  1357 c
       
  1358 c This is an example of the minimum cost flow problem data
       
  1359 c in DIMACS format.
       
  1360 c
       
  1361 p min 9 14
       
  1362 c
       
  1363 n 1 20
       
  1364 n 9 -20
       
  1365 c
       
  1366 a 1 2 0 14 0
       
  1367 a 1 4 0 23 0
       
  1368 a 2 3 0 10 2
       
  1369 a 2 4 0  9 3
       
  1370 a 3 5 2 12 1
       
  1371 a 3 8 0 18 0
       
  1372 a 4 5 0 26 0
       
  1373 a 5 2 0 11 1
       
  1374 a 5 6 0 25 5
       
  1375 a 5 7 0  4 7
       
  1376 a 6 7 0  7 0
       
  1377 a 6 8 4  8 0
       
  1378 a 7 9 0 15 3
       
  1379 a 8 9 0 20 9
       
  1380 c
       
  1381 c eof
       
  1382 \end{verbatim}
       
  1383 \end{footnotesize}
       
  1384 
       
  1385 \newpage
       
  1386 
       
  1387 \subsection{glp\_write\_mincost---write minimum cost flow problem\\data
       
  1388 in DIMACS format}
       
  1389 
       
  1390 \subsubsection*{Synopsis}
       
  1391 
       
  1392 \begin{verbatim}
       
  1393 int glp_write_mincost(glp_graph *G, int v_rhs, int a_low,
       
  1394       int a_cap, int a_cost, const char *fname);
       
  1395 \end{verbatim}
       
  1396 
       
  1397 \subsubsection*{Description}
       
  1398 
       
  1399 The routine \verb|glp_write_mincost| writes the minimum cost flow
       
  1400 problem data to a text file in DIMACS format.
       
  1401 
       
  1402 The parameter \verb|G| is the graph (network) program object, which
       
  1403 specifies the minimum cost flow problem instance.
       
  1404 
       
  1405 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1406 \verb|double| in the vertex data block, which contains $b_i$, the
       
  1407 supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$
       
  1408 for all nodes.
       
  1409 
       
  1410 The parameter \verb|a_low| specifies an offset of the field of type
       
  1411 \verb|double| in the arc data block, which contains $l_{ij}$, the lower
       
  1412 bound to the arc flow. If \verb|a_low| $<0$, it is assumed that
       
  1413 $l_{ij}=0$ for all arcs.
       
  1414 
       
  1415 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1416 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  1417 bound to the arc flow (the arc capacity). If the upper bound is
       
  1418 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e.
       
  1419 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that
       
  1420 $u_{ij}=1$ for all arcs.
       
  1421 
       
  1422 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1423 \verb|double| in the arc data block, which contains $c_{ij}$, the
       
  1424 per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that
       
  1425 $c_{ij}=0$ for all arcs.
       
  1426 
       
  1427 The character string \verb|fname| specifies a name of the text file to
       
  1428 be written out. (If the file name ends with suffix `\verb|.gz|', the
       
  1429 file is assumed to be compressed, in which case the routine performs
       
  1430 automatic compression on writing it.)
       
  1431 
       
  1432 \subsubsection*{Returns}
       
  1433 
       
  1434 If the operation was successful, the routine returns zero. Otherwise,
       
  1435 it prints an error message and returns non-zero.
       
  1436 
       
  1437 \newpage
       
  1438 
       
  1439 \subsection{glp\_mincost\_lp---convert minimum cost flow problem\\to LP}
       
  1440 
       
  1441 \subsubsection*{Synopsis}
       
  1442 
       
  1443 \begin{verbatim}
       
  1444 void glp_mincost_lp(glp_prob *lp, glp_graph *G, int names,
       
  1445       int v_rhs, int a_low, int a_cap, int a_cost);
       
  1446 \end{verbatim}
       
  1447 
       
  1448 \subsubsection*{Description}
       
  1449 
       
  1450 The routine \verb|glp_mincost_lp| builds LP problem (1)---(3), which
       
  1451 corresponds to the specified minimum cost flow problem.
       
  1452 
       
  1453 The parameter \verb|lp| is the resultant LP problem object to be built.
       
  1454 Note that on entry its current content is erased with the routine
       
  1455 \verb|glp_erase_prob|.
       
  1456 
       
  1457 The parameter \verb|G| is the graph (network) program object, which
       
  1458 specifies the minimum cost flow problem instance.
       
  1459 
       
  1460 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the
       
  1461 routine uses symbolic names of the graph object components to assign
       
  1462 symbolic names to the LP problem object components. If the flag is
       
  1463 \verb|GLP_OFF|, no symbolic names are assigned.
       
  1464 
       
  1465 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1466 \verb|double| in the vertex data block, which contains $b_i$, the
       
  1467 supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$
       
  1468 for all nodes.
       
  1469 
       
  1470 The parameter \verb|a_low| specifies an offset of the field of type
       
  1471 \verb|double| in the arc data block, which contains $l_{ij}$, the lower
       
  1472 bound to the arc flow. If \verb|a_low| $<0$, it is assumed that
       
  1473 $l_{ij}=0$ for all arcs.
       
  1474 
       
  1475 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1476 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  1477 bound to the arc flow (the arc capacity). If the upper bound is
       
  1478 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e.
       
  1479 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that
       
  1480 $u_{ij}=1$ for all arcs.
       
  1481 
       
  1482 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1483 \verb|double| in the arc data block, which contains $c_{ij}$, the
       
  1484 per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that
       
  1485 $c_{ij}=0$ for all arcs.
       
  1486 
       
  1487 \subsubsection*{Example}
       
  1488 
       
  1489 The example program below reads the minimum cost problem instance in
       
  1490 DIMACS format from file `\verb|sample.min|', converts the instance to
       
  1491 LP, and then writes the resultant LP in CPLEX format to file
       
  1492 `\verb|mincost.lp|'.
       
  1493 
       
  1494 \newpage
       
  1495 
       
  1496 \begin{footnotesize}
       
  1497 \begin{verbatim}
       
  1498 #include <stddef.h>
       
  1499 #include <glpk.h>
       
  1500 
       
  1501 typedef struct { double rhs; } v_data;
       
  1502 typedef struct { double low, cap, cost; } a_data;
       
  1503 
       
  1504 int main(void)
       
  1505 {     glp_graph *G;
       
  1506       glp_prob *lp;
       
  1507       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  1508       glp_read_mincost(G, offsetof(v_data, rhs),
       
  1509          offsetof(a_data, low), offsetof(a_data, cap),
       
  1510          offsetof(a_data, cost), "sample.min");
       
  1511       lp = glp_create_prob();
       
  1512       glp_mincost_lp(lp, G, GLP_ON, offsetof(v_data, rhs),
       
  1513          offsetof(a_data, low), offsetof(a_data, cap),
       
  1514          offsetof(a_data, cost));
       
  1515       glp_delete_graph(G);
       
  1516       glp_write_lp(lp, NULL, "mincost.lp");
       
  1517       glp_delete_prob(lp);
       
  1518       return 0;
       
  1519 }
       
  1520 \end{verbatim}
       
  1521 \end{footnotesize}
       
  1522 
       
  1523 If `\verb|sample.min|' is the example data file from the subsection
       
  1524 describing the routine \verb|glp_read_mincost|, file `\verb|mincost.lp|'
       
  1525 may look like follows:
       
  1526 
       
  1527 \begin{footnotesize}
       
  1528 \begin{verbatim}
       
  1529 Minimize
       
  1530  obj: + 3 x(2,4) + 2 x(2,3) + x(3,5) + 7 x(5,7) + 5 x(5,6)
       
  1531  + x(5,2) + 3 x(7,9) + 9 x(8,9)
       
  1532 
       
  1533 Subject To
       
  1534  r_1: + x(1,2) + x(1,4) = 20
       
  1535  r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0
       
  1536  r_3: + x(3,5) + x(3,8) - x(2,3) = 0
       
  1537  r_4: + x(4,5) - x(2,4) - x(1,4) = 0
       
  1538  r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0
       
  1539  r_6: + x(6,7) + x(6,8) - x(5,6) = 0
       
  1540  r_7: + x(7,9) - x(6,7) - x(5,7) = 0
       
  1541  r_8: + x(8,9) - x(6,8) - x(3,8) = 0
       
  1542  r_9: - x(8,9) - x(7,9) = -20
       
  1543 
       
  1544 Bounds
       
  1545  0 <= x(1,4) <= 23
       
  1546  0 <= x(1,2) <= 14
       
  1547  0 <= x(2,4) <= 9
       
  1548  0 <= x(2,3) <= 10
       
  1549  0 <= x(3,8) <= 18
       
  1550  2 <= x(3,5) <= 12
       
  1551  0 <= x(4,5) <= 26
       
  1552  0 <= x(5,7) <= 4
       
  1553  0 <= x(5,6) <= 25
       
  1554  0 <= x(5,2) <= 11
       
  1555  4 <= x(6,8) <= 8
       
  1556  0 <= x(6,7) <= 7
       
  1557  0 <= x(7,9) <= 15
       
  1558  0 <= x(8,9) <= 20
       
  1559 
       
  1560 End
       
  1561 \end{verbatim}
       
  1562 \end{footnotesize}
       
  1563 
       
  1564 \subsection{glp\_mincost\_okalg---solve minimum cost flow problem with
       
  1565 out-of-kilter algorithm}
       
  1566 
       
  1567 \subsubsection*{Synopsis}
       
  1568 
       
  1569 \begin{verbatim}
       
  1570 int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low,
       
  1571       int a_cap, int a_cost, double *sol, int a_x, int v_pi);
       
  1572 \end{verbatim}
       
  1573 
       
  1574 \subsubsection*{Description}
       
  1575 
       
  1576 The routine \verb|glp_mincost_okalg| finds optimal solution to the
       
  1577 minimum cost flow problem with the out-of-kilter
       
  1578 algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm
       
  1579 is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson,
       
  1580 ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962),
       
  1581 Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this
       
  1582 routine requires all the problem data to be integer-valued.
       
  1583 
       
  1584 The parameter \verb|G| is a graph (network) program object which
       
  1585 specifies the minimum cost flow problem instance to be solved.
       
  1586 
       
  1587 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1588 \verb|double| in the vertex data block, which contains $b_i$, the
       
  1589 supply/demand value. This value must be integer in the range
       
  1590 [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|v_rhs| $<0$, it is
       
  1591 assumed that $b_i=0$ for all nodes.
       
  1592 
       
  1593 The parameter \verb|a_low| specifies an offset of the field of type
       
  1594 \verb|double| in the arc data block, which contains $l_{ij}$, the lower
       
  1595 bound to the arc flow. This bound must be integer in the range
       
  1596 [$0$, \verb|INT_MAX|]. If \verb|a_low| $<0$, it is assumed that
       
  1597 $l_{ij}=0$ for all arcs.
       
  1598 
       
  1599 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1600 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  1601 bound to the arc flow (the arc capacity). This bound must be integer in
       
  1602 the range [$l_{ij}$, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is
       
  1603 assumed that $u_{ij}=1$ for all arcs.
       
  1604 
       
  1605 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1606 \verb|double| in the arc data block, which contains $c_{ij}$, the
       
  1607 per-unit cost of the arc flow. This value must be integer in the range
       
  1608 [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|a_cost| $<0$, it is
       
  1609 assumed that $c_{ij}=0$ for all arcs.
       
  1610 
       
  1611 The parameter \verb|sol| specifies a location, to which the routine
       
  1612 stores the objective value (that is, the total cost) found. If
       
  1613 \verb|sol| is NULL, the objective value is not stored.
       
  1614 
       
  1615 The parameter \verb|a_x| specifies an offset of the field of type
       
  1616 \verb|double| in the arc data block, to which the routine stores
       
  1617 $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow value is
       
  1618 not stored.
       
  1619 
       
  1620 The parameter \verb|v_pi| specifies an offset of the field of type
       
  1621 \verb|double| in the vertex data block, to which the routine stores
       
  1622 $\pi_i$, the node potential, which is the Lagrange multiplier for the
       
  1623 corresponding flow conservation equality constraint (see (2) in
       
  1624 Subsection ``Background''). If necessary, the application program may
       
  1625 use the node potentials to compute $\lambda_{ij}$, reduced costs of the
       
  1626 arc flows $x_{ij}$, which are the Lagrange multipliers for the arc flow
       
  1627 bound constraints (see (3) ibid.), using the following formula:
       
  1628 $$\lambda_{ij}=c_{ij}-(\pi_i-\pi_j),$$
       
  1629 where $c_{ij}$ is the per-unit cost for arc $(i,j)$.
       
  1630 
       
  1631 Note that all solution components (the objective value, arc flows, and
       
  1632 node potentials) computed by the routine are always integer-valued.
       
  1633 
       
  1634 \subsubsection*{Returns}
       
  1635 
       
  1636 \def\arraystretch{1}
       
  1637 
       
  1638 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}}
       
  1639 0 & Optimal solution found.\\
       
  1640 \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\
       
  1641 \verb|GLP_EDATA| & Unable to start the search, because some problem
       
  1642 data are either not integer-valued or out of range. This code is also
       
  1643 returned if the total supply, which is the sum of $b_i$ over all source
       
  1644 nodes (nodes with $b_i>0$), exceeds \verb|INT_MAX|.\\
       
  1645 \end{tabular}
       
  1646 
       
  1647 \noindent
       
  1648 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}}
       
  1649 \verb|GLP_ERANGE| & The search was prematurely terminated because of
       
  1650 integer overflow.\\
       
  1651 \verb|GLP_EFAIL| & An error has been detected in the program logic.
       
  1652 (If this code is returned for your problem instance, please report to
       
  1653 \verb|<bug-glpk@gnu.org>|.)\\
       
  1654 \end{tabular}
       
  1655 
       
  1656 \subsubsection*{Comments}
       
  1657 
       
  1658 By design the out-of-kilter algorithm is applicable only to networks,
       
  1659 where $b_i=0$ for {\it all} nodes, i.e. actually this algorithm finds a
       
  1660 minimal cost {\it circulation}. Due to this requirement the routine
       
  1661 \verb|glp_mincost_okalg| converts the original network to a network
       
  1662 suitable for the out-of-kilter algorithm in the following
       
  1663 way:\footnote{The conversion is performed internally and does not change
       
  1664 the original network program object passed to the routine.}
       
  1665 
       
  1666 1) it adds two auxiliary nodes $s$ and $t$;
       
  1667 
       
  1668 2) for each original node $i$ with $b_i>0$ the routine adds auxiliary
       
  1669 supply arc $(s\rightarrow i)$, flow $x_{si}$ through which is costless
       
  1670 ($c_{si}=0$) and fixed to $+b_i$ ($l_{si}=u_{si}=+b_i$);
       
  1671 
       
  1672 3) for each original node $i$ with $b_i<0$ the routine adds auxiliary
       
  1673 demand arc $(i\rightarrow t)$, flow $x_{it}$ through which is costless
       
  1674 ($c_{it}=0$) and fixed to $-b_i$ ($l_{it}=u_{it}=-b_i$);
       
  1675 
       
  1676 4) finally, the routine adds auxiliary feedback arc $(t\rightarrow s)$,
       
  1677 flow $x_{ts}$ through which is also costless ($c_{ts}=0$) and fixed to
       
  1678 $F$ ($l_{ts}=u_{ts}=F$), where $\displaystyle F=\sum_{b_i>0}b_i$ is the
       
  1679 total supply.
       
  1680 
       
  1681 \subsubsection*{Example}
       
  1682 
       
  1683 The example program below reads the minimum cost problem instance in
       
  1684 DIMACS format from file `\verb|sample.min|', solves it by using the
       
  1685 routine \verb|glp_mincost_okalg|, and writes the solution found to the
       
  1686 standard output.
       
  1687 
       
  1688 \begin{footnotesize}
       
  1689 \begin{verbatim}
       
  1690 #include <stddef.h>
       
  1691 #include <stdio.h>
       
  1692 #include <stdlib.h>
       
  1693 #include <glpk.h>
       
  1694 
       
  1695 typedef struct { double rhs, pi; } v_data;
       
  1696 typedef struct { double low, cap, cost, x; } a_data;
       
  1697 
       
  1698 #define node(v) ((v_data *)((v)->data))
       
  1699 #define arc(a)  ((a_data *)((a)->data))
       
  1700 
       
  1701 int main(void)
       
  1702 {     glp_graph *G;
       
  1703       glp_vertex *v, *w;
       
  1704       glp_arc *a;
       
  1705       int i, ret;
       
  1706       double sol;
       
  1707       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  1708       glp_read_mincost(G, offsetof(v_data, rhs),
       
  1709          offsetof(a_data, low), offsetof(a_data, cap),
       
  1710          offsetof(a_data, cost), "sample.min");
       
  1711       ret = glp_mincost_okalg(G, offsetof(v_data, rhs),
       
  1712          offsetof(a_data, low), offsetof(a_data, cap),
       
  1713          offsetof(a_data, cost), &sol, offsetof(a_data, x),
       
  1714          offsetof(v_data, pi));
       
  1715       printf("ret = %d; sol = %5g\n", ret, sol);
       
  1716       for (i = 1; i <= G->nv; i++)
       
  1717       {  v = G->v[i];
       
  1718          printf("node %d:    pi = %5g\n", i, node(v)->pi);
       
  1719          for (a = v->out; a != NULL; a = a->t_next)
       
  1720          {  w = a->head;
       
  1721             printf("arc  %d->%d: x  = %5g; lambda = %5g\n",
       
  1722                v->i, w->i, arc(a)->x,
       
  1723                arc(a)->cost - (node(v)->pi - node(w)->pi));
       
  1724          }
       
  1725       }
       
  1726       glp_delete_graph(G);
       
  1727       return 0;
       
  1728 }
       
  1729 \end{verbatim}
       
  1730 \end{footnotesize}
       
  1731 
       
  1732 If `\verb|sample.min|' is the example data file from the subsection
       
  1733 describing the routine \verb|glp_read_mincost|, the output may look like
       
  1734 follows:
       
  1735 
       
  1736 \begin{footnotesize}
       
  1737 \begin{verbatim}
       
  1738 Reading min-cost flow problem data from `sample.min'...
       
  1739 Flow network has 9 nodes and 14 arcs
       
  1740 24 lines were read
       
  1741 ret = 0; sol =   213
       
  1742 node 1:    pi =   -12
       
  1743 arc  1->4: x  =    13; lambda =     0
       
  1744 arc  1->2: x  =     7; lambda =     0
       
  1745 node 2:    pi =   -12
       
  1746 arc  2->4: x  =     0; lambda =     3
       
  1747 arc  2->3: x  =     7; lambda =     0
       
  1748 node 3:    pi =   -14
       
  1749 arc  3->8: x  =     5; lambda =     0
       
  1750 arc  3->5: x  =     2; lambda =     3
       
  1751 node 4:    pi =   -12
       
  1752 arc  4->5: x  =    13; lambda =     0
       
  1753 node 5:    pi =   -12
       
  1754 arc  5->7: x  =     4; lambda =    -1
       
  1755 arc  5->6: x  =    11; lambda =     0
       
  1756 arc  5->2: x  =     0; lambda =     1
       
  1757 node 6:    pi =   -17
       
  1758 arc  6->8: x  =     4; lambda =     3
       
  1759 arc  6->7: x  =     7; lambda =    -3
       
  1760 node 7:    pi =   -20
       
  1761 arc  7->9: x  =    11; lambda =     0
       
  1762 node 8:    pi =   -14
       
  1763 arc  8->9: x  =     9; lambda =     0
       
  1764 node 9:    pi =   -23
       
  1765 \end{verbatim}
       
  1766 \end{footnotesize}
       
  1767 
       
  1768 \subsection{glp\_netgen---Klingman's network problem generator}
       
  1769 
       
  1770 \subsubsection*{Synopsis}
       
  1771 
       
  1772 \begin{verbatim}
       
  1773 int glp_netgen(glp_graph *G, int v_rhs, int a_cap, int a_cost,
       
  1774       const int parm[1+15]);
       
  1775 \end{verbatim}
       
  1776 
       
  1777 \subsubsection*{Description}
       
  1778 
       
  1779 The routine \verb|glp_netgen| is a GLPK version of the network problem
       
  1780 generator developed by Dr.~Darwin~Klingman.\footnote{D.~Klingman,
       
  1781 A.~Napier, and J.~Stutz. NETGEN: A program for generating large scale
       
  1782 capacitated assignment, transportation, and minimum cost flow networks.
       
  1783 Management Science 20 (1974), 814-20.} It can create capacitated and
       
  1784 uncapacitated minimum cost flow (or transshipment), transportation, and
       
  1785 assignment problems.
       
  1786 
       
  1787 The parameter \verb|G| specifies the graph object, to which the
       
  1788 generated  problem data have to be stored. Note that on entry the graph
       
  1789 object  is erased with the routine \verb|glp_erase_graph|.
       
  1790 
       
  1791 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1792 \verb|double| in the vertex data block, to which the routine stores the
       
  1793 supply or  demand value. If \verb|v_rhs| $<0$, the value is not stored.
       
  1794 
       
  1795 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1796 \verb|double| in the arc data block, to which the routine stores the
       
  1797 arc capacity. If \verb|a_cap| $<0$, the capacity is not stored.
       
  1798 
       
  1799 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1800 \verb|double| in the arc data block, to which the routine stores the
       
  1801 per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not
       
  1802 stored.
       
  1803 
       
  1804 The array \verb|parm| contains description of the network to be
       
  1805 generated:
       
  1806 
       
  1807 \begin{tabular}{@{}lll@{}}
       
  1808 \verb|parm[0] |&             &not used\\
       
  1809 \verb|parm[1] |&\verb|iseed |&8-digit positive random number seed\\
       
  1810 \verb|parm[2] |&\verb|nprob |&8-digit problem id number\\
       
  1811 \verb|parm[3] |&\verb|nodes |&total number of nodes\\
       
  1812 \verb|parm[4] |&\verb|nsorc |&total number of source nodes\\
       
  1813 &&(including transshipment nodes)\\
       
  1814 \verb|parm[5] |&\verb|nsink |&total number of sink nodes\\
       
  1815 &&(including transshipment nodes)\\
       
  1816 \verb|parm[6] |&\verb|iarcs |&number of arc\\
       
  1817 \verb|parm[7] |&\verb|mincst|&minimum cost for arcs\\
       
  1818 \verb|parm[8] |&\verb|maxcst|&maximum cost for arcs\\
       
  1819 \verb|parm[9] |&\verb|itsup |&total supply\\
       
  1820 \end{tabular}
       
  1821 
       
  1822 \begin{tabular}{@{}lll@{}}
       
  1823 \verb|parm[10]|&\verb|ntsorc|&number of transshipment source nodes\\
       
  1824 \verb|parm[11]|&\verb|ntsink|&number of transshipment sink nodes\\
       
  1825 \verb|parm[12]|&\verb|iphic |&percentage of skeleton arcs to be given
       
  1826 the maxi-\\&&mum cost\\
       
  1827 \verb|parm[13]|&\verb|ipcap |&percentage of arcs to be capacitated\\
       
  1828 \verb|parm[14]|&\verb|mincap|&minimum upper bound for capacitated arcs\\
       
  1829 \verb|parm[15]|&\verb|maxcap|&maximum upper bound for capacitated arcs\\
       
  1830 \end{tabular}
       
  1831 
       
  1832 \subsubsection*{Notes}
       
  1833 
       
  1834 \noindent\indent
       
  1835 1. The routine generates a transportation problem if:
       
  1836 $${\tt nsorc}+{\tt nsink}={\tt nodes},
       
  1837 \  {\tt ntsorc}=0,\ \mbox{and}\ {\tt ntsink}=0.$$
       
  1838 
       
  1839 2. The routine generates an assignment problem if the requirements for
       
  1840 a transportation problem are met and:
       
  1841 $${\tt nsorc}={\tt nsink}\ \mbox{and}\ {\tt itsup}={\tt nsorc}.$$
       
  1842 
       
  1843 3. The routine always generates connected graphs. So, if the number of
       
  1844 requested arcs has been reached and the generated instance is not fully
       
  1845 connected, the routine generates a few remaining arcs to ensure
       
  1846 connectedness. Thus, the actual number of arcs generated by the routine
       
  1847 may be greater than the requested number of arcs.
       
  1848 
       
  1849 \subsubsection*{Returns}
       
  1850 
       
  1851 If the instance was successfully generated, the routine
       
  1852 \verb|glp_netgen| returns zero; otherwise, if specified parameters are
       
  1853 inconsistent, the routine returns a non-zero error code.
       
  1854 
       
  1855 \subsection{glp\_gridgen---grid-like network problem generator}
       
  1856 
       
  1857 \subsubsection*{Synopsis}
       
  1858 
       
  1859 \begin{verbatim}
       
  1860 int glp_gridgen(glp_graph *G, int v_rhs, int a_cap, int a_cost,
       
  1861       const int parm[1+14]);
       
  1862 \end{verbatim}
       
  1863 
       
  1864 \subsubsection*{Description}
       
  1865 
       
  1866 The routine \verb|glp_gridgen| is a GLPK version of the grid-like
       
  1867 network problem generator developed by Yusin Lee and Jim
       
  1868 Orlin.\footnote{Y.~Lee and J.~Orlin. GRIDGEN generator., 1991. The
       
  1869 original code is publically available from
       
  1870 {\tt<ftp://dimacs.rutgers.edu/pub/netflow/generators/network/gridgen>}.}
       
  1871 
       
  1872 The parameter \verb|G| specifies the graph object, to which the
       
  1873 generated  problem data have to be stored. Note that on entry the graph
       
  1874 object  is erased with the routine \verb|glp_erase_graph|.
       
  1875 
       
  1876 The parameter \verb|v_rhs| specifies an offset of the field of type
       
  1877 \verb|double| in the vertex data block, to which the routine stores the
       
  1878 supply or  demand value. If \verb|v_rhs| $<0$, the value is not stored.
       
  1879 
       
  1880 The parameter \verb|a_cap| specifies an offset of the field of type
       
  1881 \verb|double| in the arc data block, to which the routine stores the
       
  1882 arc capacity. If \verb|a_cap| $<0$, the capacity is not stored.
       
  1883 
       
  1884 The parameter \verb|a_cost| specifies an offset of the field of type
       
  1885 \verb|double| in the arc data block, to which the routine stores the
       
  1886 per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not
       
  1887 stored.
       
  1888 
       
  1889 The array \verb|parm| contains parameters of the network to be
       
  1890 generated:
       
  1891 
       
  1892 \begin{tabular}{@{}ll@{}}
       
  1893 \verb|parm[0] |&not used\\
       
  1894 \verb|parm[1] |&two-ways arcs indicator:\\
       
  1895                &1 --- if links in both direction should be generated\\
       
  1896                &0 --- otherwise\\
       
  1897 \verb|parm[2] |&random number seed (a positive integer)\\
       
  1898 \verb|parm[3] |&number of nodes (the number of nodes generated might
       
  1899 be\\&slightly different to make the network a grid)\\
       
  1900 \verb|parm[4] |&grid width\\
       
  1901 \verb|parm[5] |&number of sources\\
       
  1902 \verb|parm[6] |&number of sinks\\
       
  1903 \verb|parm[7] |&average degree\\
       
  1904 \verb|parm[8] |&total flow\\
       
  1905 \verb|parm[9] |&distribution of arc costs:\\
       
  1906                &1 --- uniform\\
       
  1907                &2 --- exponential\\
       
  1908 \verb|parm[10]|&lower bound for arc cost (uniform)\\
       
  1909                &$100\lambda$ (exponential)\\
       
  1910 \verb|parm[11]|&upper bound for arc cost (uniform)\\
       
  1911                &not used (exponential)\\
       
  1912 \verb|parm[12]|&distribution of arc capacities:\\
       
  1913                &1 --- uniform\\
       
  1914                &2 --- exponential\\
       
  1915 \verb|parm[13]|&lower bound for arc capacity (uniform)\\
       
  1916                &$100\lambda$ (exponential)\\
       
  1917 \verb|parm[14]|&upper bound for arc capacity (uniform)\\
       
  1918                &not used (exponential)\\
       
  1919 \end{tabular}
       
  1920 
       
  1921 \subsubsection*{Returns}
       
  1922 
       
  1923 If the instance was successfully generated, the routine
       
  1924 \verb|glp_gridgen| returns zero; otherwise, if specified parameters are
       
  1925 inconsistent, the routine returns a non-zero error code.
       
  1926 
       
  1927 \subsubsection*{Comments\footnote{This material is based on comments
       
  1928 to the original version of GRIDGEN.}}
       
  1929 
       
  1930 This network generator generates a grid-like network plus a super node.
       
  1931 In additional to the arcs connecting the nodes in the grid, there is an
       
  1932 arc from each supply node to the super node and from the super node to
       
  1933 each demand node to guarantee feasiblity. These arcs have very high
       
  1934 costs and very big capacities.
       
  1935 
       
  1936 The idea of this network generator is as follows: First, a grid of
       
  1937 $n_1\times n_2$ is generated. For example, $5\times 3$. The nodes are
       
  1938 numbered as 1 to 15, and the supernode is numbered as $n_1\times n_2+1$.
       
  1939 Then arcs between adjacent nodes are generated. For these arcs, the user
       
  1940 is allowed to specify either to generate two-way arcs or one-way arcs.
       
  1941 If two-way arcs are to be generated, two arcs, one in each direction,
       
  1942 will be generated between each adjacent node pairs. Otherwise, only one
       
  1943 arc will be generated. If this is the case, the arcs will be generated
       
  1944 in alterntive directions as shown below.
       
  1945 
       
  1946 \bigskip
       
  1947 
       
  1948 \noindent\hfil
       
  1949 \xymatrix
       
  1950 {1\ar[r]\ar[d]&2\ar[r]&3\ar[r]\ar[d]&4\ar[r]&5\ar[d]\\
       
  1951 6\ar[d]&7\ar[l]\ar[u]&8\ar[l]\ar[d]&9\ar[l]\ar[u]&10\ar[l]\ar[d]\\
       
  1952 11\ar[r]&12\ar[r]\ar[u]&13\ar[r]&14\ar[r]\ar[u]&15\\
       
  1953 }
       
  1954 
       
  1955 \bigskip
       
  1956 
       
  1957 Then the arcs between the super node and the source/sink nodes are added
       
  1958 as mentioned before. If the number of arcs still doesn't reach the
       
  1959 requirement, additional arcs will be added by uniformly picking random
       
  1960 node pairs. There is no checking to prevent multiple arcs between any
       
  1961 pair of nodes. However, there will be no self-arcs (arcs that poins back
       
  1962 to its tail node) in the network.
       
  1963 
       
  1964 The source and sink nodes are selected uniformly in the network, and
       
  1965 the imbalances of each source/sink node are also assigned by uniform
       
  1966 distribution.
       
  1967 
       
  1968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
  1969 
       
  1970 \newpage
       
  1971 
       
  1972 \section{Maximum flow problem}
       
  1973 
       
  1974 \subsection{Background}
       
  1975 
       
  1976 The {\it maximum flow problem} (MAXFLOW) is stated as follows. Let
       
  1977 there be given a directed graph (flow network) $G=(V,A)$, where $V$ is
       
  1978 a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs.
       
  1979 Let also for each arc $a=(i,j)\in A$ there be given its capacity
       
  1980 $u_{ij}$. The problem is, for given {\it source} node $s\in V$ and
       
  1981 {\it sink} node $t\in V$, to find flows $x_{ij}$ through every arc of
       
  1982 the network, which satisfy the specified arc capacities and the
       
  1983 conservation constraints at all nodes, and maximize the total flow $F$
       
  1984 through the network from $s$ to $t$. Here the conservation constraint
       
  1985 at a node means that the total flow entering this node through its
       
  1986 incoming arcs (plus $F$, if it is the source node) must be equal to the
       
  1987 total flow leaving this node through its outgoing arcs (plus $F$, if it
       
  1988 is the sink node).
       
  1989 
       
  1990 An example of the maximum flow problem, where $s=v_1$ and $t=v_9$, is
       
  1991 shown on Fig.~2.
       
  1992 
       
  1993 \bigskip
       
  1994 
       
  1995 \noindent\hfil
       
  1996 \xymatrix @C=48pt
       
  1997 {_{F}\ar@{~>}[d]&
       
  1998 v_2\ar[r]|{_{10}}\ar[dd]|{_{9}}&
       
  1999 v_3\ar[dd]|{_{12}}\ar[r]|{_{18}}&
       
  2000 v_8\ar[rd]|{_{20}}&\\
       
  2001 v_1\ar[ru]|{_{14}}\ar[rd]|{_{23}}&&&
       
  2002 v_6\ar[d]|{_{7}}\ar[u]|{_{8}}&
       
  2003 v_9\ar@{~>}[d]\\
       
  2004 &v_4\ar[r]|{_{26}}&
       
  2005 v_5\ar[luu]|{_{11}}\ar[ru]|{_{25}}\ar[r]|{_{4}}&
       
  2006 v_7\ar[ru]|{_{15}}&_{F}\\
       
  2007 }
       
  2008 
       
  2009 \bigskip
       
  2010 
       
  2011 \noindent\hfil
       
  2012 Fig.~2. An example of the maximum flow problem.
       
  2013 
       
  2014 \bigskip
       
  2015 
       
  2016 The maximum flow problem can be naturally formulated as the following
       
  2017 LP problem:
       
  2018 
       
  2019 \medskip
       
  2020 
       
  2021 \noindent
       
  2022 \hspace{.5in}maximize
       
  2023 $$F\eqno(4)$$
       
  2024 \hspace{.5in}subject to
       
  2025 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=\left\{
       
  2026 \begin{array}{@{\ }rl}
       
  2027 +F,&\hbox{for}\ i=s\\
       
  2028  0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\
       
  2029 -F,&\hbox{for}\ i=t\\
       
  2030 \end{array}
       
  2031 \right.\eqno(5)
       
  2032 $$
       
  2033 $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A
       
  2034 \eqno(6)$$
       
  2035 
       
  2036 \medskip
       
  2037 
       
  2038 \noindent
       
  2039 where $F\geq 0$ is an additional variable playing the role of the
       
  2040 objective.
       
  2041 
       
  2042 \newpage
       
  2043 
       
  2044 Another LP formulation of the maximum flow problem, which does not
       
  2045 include the variable $F$, is the following:
       
  2046 
       
  2047 \medskip
       
  2048 
       
  2049 \noindent
       
  2050 \hspace{.5in}maximize
       
  2051 $$z=\sum_{(s,j)\in A}x_{sj}-\sum_{(j,s)\in A}x_{js}\ (=F)\eqno(7)$$
       
  2052 \hspace{.5in}subject to
       
  2053 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}\left\{
       
  2054 \begin{array}{@{\ }rl}
       
  2055 \geq 0,&\hbox{for}\ i=s\\
       
  2056 =0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\
       
  2057 \leq 0,&\hbox{for}\ i=t\\
       
  2058 \end{array}
       
  2059 \right.\eqno(8)
       
  2060 $$
       
  2061 $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A
       
  2062 \eqno(9)$$
       
  2063 
       
  2064 \subsection{glp\_read\_maxflow---read maximum flow problem data\\in
       
  2065 DIMACS format}
       
  2066 
       
  2067 \subsubsection*{Synopsis}
       
  2068 
       
  2069 \begin{verbatim}
       
  2070 int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap,
       
  2071       const char *fname);
       
  2072 \end{verbatim}
       
  2073 
       
  2074 \subsubsection*{Description}
       
  2075 
       
  2076 The routine \verb|glp_read_maxflow| reads the maximum flow problem
       
  2077 data from a text file in DIMACS format.
       
  2078 
       
  2079 The parameter \verb|G| specifies the graph object, to which the problem
       
  2080 data have to be stored. Note that before reading data the current
       
  2081 content of the graph object is completely erased with the routine
       
  2082 \verb|glp_erase_graph|.
       
  2083 
       
  2084 The pointer \verb|s| specifies a location, to which the routine stores
       
  2085 the ordinal number of the source node. If \verb|s| is \verb|NULL|, the
       
  2086 source node number is not stored.
       
  2087 
       
  2088 The pointer \verb|t| specifies a location, to which the routine stores
       
  2089 the ordinal number of the sink node. If \verb|t| is \verb|NULL|, the
       
  2090 sink node number is not stored.
       
  2091 
       
  2092 The parameter \verb|a_cap| specifies an offset of the field of type
       
  2093 \verb|double| in the arc data block, to which the routine stores
       
  2094 $u_{ij}$, the arc capacity. If \verb|a_cap| $<0$, the arc capacity is
       
  2095 not stored.
       
  2096 
       
  2097 The character string \verb|fname| specifies the name of a text file to
       
  2098 be read in. (If the file name name ends with the suffix `\verb|.gz|',
       
  2099 the file is assumed to be compressed, in which case the routine
       
  2100 decompresses it ``on the fly''.)
       
  2101 
       
  2102 \subsubsection*{Returns}
       
  2103 
       
  2104 If the operation was successful, the routine returns zero. Otherwise,
       
  2105 it prints an error message and returns non-zero.
       
  2106 
       
  2107 \subsubsection*{Example}
       
  2108 
       
  2109 \begin{footnotesize}
       
  2110 \begin{verbatim}
       
  2111 typedef struct
       
  2112 {     /* arc data block */
       
  2113       ...
       
  2114       double cap;
       
  2115       ...
       
  2116 } a_data;
       
  2117 
       
  2118 int main(void)
       
  2119 {     glp_graph *G;
       
  2120       int s, t, ret;
       
  2121       G = glp_create_graph(..., sizeof(a_data));
       
  2122       ret = glp_read_maxflow(G, &s, &t, offsetof(a_data, cap),
       
  2123          "sample.max");
       
  2124       if (ret != 0) goto ...
       
  2125       ...
       
  2126 }
       
  2127 \end{verbatim}
       
  2128 \end{footnotesize}
       
  2129 
       
  2130 \subsubsection*{DIMACS maximum flow problem format\footnote{This
       
  2131 material is based on the paper ``The First DIMACS International
       
  2132 Algorithm Implementation Challenge: Problem Definitions and
       
  2133 Specifications'', which is publically available at
       
  2134 {\tt http://dimacs.rutgers.edu/Challenges/}.}}
       
  2135 \label{subsecmaxflow}
       
  2136 
       
  2137 The DIMACS input file is a plain ASCII text file. It contains
       
  2138 {\it lines} of several types described below. A line is terminated with
       
  2139 an end-of-line character. Fields in each line are separated by at least
       
  2140 one blank space. Each line begins with a one-character designator to
       
  2141 identify the line type.
       
  2142 
       
  2143 Note that DIMACS requires all numerical quantities to be integers in
       
  2144 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be
       
  2145 floating-point numbers.
       
  2146 
       
  2147 \paragraph{Comment lines.} Comment lines give human-readable information
       
  2148 about the file and are ignored by programs. Comment lines can appear
       
  2149 anywhere in the file. Each comment line begins with a lower-case
       
  2150 character \verb|c|.
       
  2151 
       
  2152 \begin{verbatim}
       
  2153    c This is a comment line
       
  2154 \end{verbatim}
       
  2155 
       
  2156 \newpage
       
  2157 
       
  2158 \paragraph{Problem line.} There is one problem line per data file. The
       
  2159 problem line must appear before any node or arc descriptor lines. It has
       
  2160 the following format:
       
  2161 
       
  2162 \begin{verbatim}
       
  2163    p max NODES ARCS
       
  2164 \end{verbatim}
       
  2165 
       
  2166 \noindent
       
  2167 The lower-case character \verb|p| signifies that this is a problem line.
       
  2168 The three-character problem designator \verb|max| identifies the file as
       
  2169 containing specification information for the maximum flow problem. The
       
  2170 \verb|NODES| field contains an integer value specifying the number of
       
  2171 nodes in the network. The \verb|ARCS| field contains an integer value
       
  2172 specifying the number of arcs in the network.
       
  2173 
       
  2174 \paragraph{Node descriptors.} Two node descriptor lines for the source
       
  2175 and sink nodes must appear before all arc descriptor lines. They may
       
  2176 appear in either order, each with the following format:
       
  2177 
       
  2178 \begin{verbatim}
       
  2179    n ID WHICH
       
  2180 \end{verbatim}
       
  2181 
       
  2182 \noindent
       
  2183 The lower-case character \verb|n| signifies that this a node descriptor
       
  2184 line. The \verb|ID| field gives a node identification number, an integer
       
  2185 between 1 and \verb|NODES|. The \verb|WHICH| field gives either a
       
  2186 lower-case \verb|s| or \verb|t|, designating the source and sink,
       
  2187 respectively.
       
  2188 
       
  2189 \paragraph{Arc descriptors.} There is one arc descriptor line for each
       
  2190 arc in the network. Arc descriptor lines are of the following format:
       
  2191 
       
  2192 \begin{verbatim}
       
  2193    a SRC DST CAP
       
  2194 \end{verbatim}
       
  2195 
       
  2196 \noindent
       
  2197 The lower-case character \verb|a| signifies that this is an arc
       
  2198 descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives
       
  2199 the identification number $i$ for the tail endpoint, and the \verb|DST|
       
  2200 field gives the identification number $j$ for the head endpoint.
       
  2201 Identification numbers are integers between 1 and \verb|NODES|. The
       
  2202 \verb|CAP| field gives the arc capacity, i.e. maximum amount of flow
       
  2203 that can be sent along arc $(i,j)$ in a feasible flow.
       
  2204 
       
  2205 \paragraph{Example.} Below here is an example of the data file in
       
  2206 DIMACS format corresponding to the maximum flow problem shown on Fig~2.
       
  2207 
       
  2208 \newpage
       
  2209 
       
  2210 \begin{footnotesize}
       
  2211 \begin{verbatim}
       
  2212 c sample.max
       
  2213 c
       
  2214 c This is an example of the maximum flow problem data
       
  2215 c in DIMACS format.
       
  2216 c
       
  2217 p max 9 14
       
  2218 c
       
  2219 n 1 s
       
  2220 n 9 t
       
  2221 c
       
  2222 a 1 2 14
       
  2223 a 1 4 23
       
  2224 a 2 3 10
       
  2225 a 2 4  9
       
  2226 a 3 5 12
       
  2227 a 3 8 18
       
  2228 a 4 5 26
       
  2229 a 5 2 11
       
  2230 a 5 6 25
       
  2231 a 5 7  4
       
  2232 a 6 7  7
       
  2233 a 6 8  8
       
  2234 a 7 9 15
       
  2235 a 8 9 20
       
  2236 c
       
  2237 c eof
       
  2238 \end{verbatim}
       
  2239 \end{footnotesize}
       
  2240 
       
  2241 \subsection{glp\_write\_maxflow---write maximum flow problem data\\
       
  2242 in DIMACS format}
       
  2243 
       
  2244 \subsubsection*{Synopsis}
       
  2245 
       
  2246 \begin{verbatim}
       
  2247 int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap,
       
  2248       const char *fname);
       
  2249 \end{verbatim}
       
  2250 
       
  2251 \subsubsection*{Description}
       
  2252 
       
  2253 The routine \verb|glp_write_maxflow| writes the maximum flow problem
       
  2254 data to a text file in DIMACS format.
       
  2255 
       
  2256 The parameter \verb|G| is the graph (network) program object, which
       
  2257 specifies the maximum flow problem instance.
       
  2258 
       
  2259 The parameter \verb|s| specifies the ordinal number of the source node.
       
  2260 
       
  2261 The parameter \verb|t| specifies the ordinal number of the sink node.
       
  2262 
       
  2263 The parameter \verb|a_cap| specifies an offset of the field of type
       
  2264 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  2265 bound to the arc flow (the arc capacity). If the upper bound is
       
  2266 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e.
       
  2267 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that
       
  2268 $u_{ij}=1$ for all arcs.
       
  2269 
       
  2270 The character string \verb|fname| specifies a name of the text file to
       
  2271 be written out. (If the file name ends with suffix `\verb|.gz|', the
       
  2272 file is assumed to be compressed, in which case the routine performs
       
  2273 automatic compression on writing it.)
       
  2274 
       
  2275 \subsubsection*{Returns}
       
  2276 
       
  2277 If the operation was successful, the routine returns zero. Otherwise,
       
  2278 it prints an error message and returns non-zero.
       
  2279 
       
  2280 \subsection{glp\_maxflow\_lp---convert maximum flow problem to LP}
       
  2281 
       
  2282 \subsubsection*{Synopsis}
       
  2283 
       
  2284 \begin{verbatim}
       
  2285 void glp_maxflow_lp(glp_prob *lp, glp_graph *G, int names,
       
  2286       int s, int t, int a_cap);
       
  2287 \end{verbatim}
       
  2288 
       
  2289 \subsubsection*{Description}
       
  2290 
       
  2291 The routine \verb|glp_maxflow_lp| builds LP problem (7)---(9), which
       
  2292 corresponds to the specified maximum flow problem.
       
  2293 
       
  2294 The parameter \verb|lp| is the resultant LP problem object to be built.
       
  2295 Note that on entry its current content is erased with the routine
       
  2296 \verb|glp_erase_prob|.
       
  2297 
       
  2298 The parameter \verb|G| is the graph (network) program object, which
       
  2299 specifies the maximum flow problem instance.
       
  2300 
       
  2301 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the
       
  2302 routine uses symbolic names of the graph object components to assign
       
  2303 symbolic names to the LP problem object components. If the flag is
       
  2304 \verb|GLP_OFF|, no symbolic names are assigned.
       
  2305 
       
  2306 The parameter \verb|s| specifies the ordinal number of the source node.
       
  2307 
       
  2308 The parameter \verb|t| specifies the ordinal number of the sink node.
       
  2309 
       
  2310 The parameter \verb|a_cap| specifies an offset of the field of type
       
  2311 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  2312 bound to the arc flow (the arc capacity). If the upper bound is
       
  2313 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e.
       
  2314 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that
       
  2315 $u_{ij}=1$ for all arcs.
       
  2316 
       
  2317 \subsubsection*{Example}
       
  2318 
       
  2319 The example program below reads the maximum flow problem in DIMACS
       
  2320 format from file `\verb|sample.max|', converts the instance to LP, and
       
  2321 then writes the resultant LP in CPLEX format to file
       
  2322 `\verb|maxflow.lp|'.
       
  2323 
       
  2324 \begin{footnotesize}
       
  2325 \begin{verbatim}
       
  2326 #include <stddef.h>
       
  2327 #include <glpk.h>
       
  2328 
       
  2329 int main(void)
       
  2330 {     glp_graph *G;
       
  2331       glp_prob *lp;
       
  2332       int s, t;
       
  2333       G = glp_create_graph(0, sizeof(double));
       
  2334       glp_read_maxflow(G, &s, &t, 0, "sample.max");
       
  2335       lp = glp_create_prob();
       
  2336       glp_maxflow_lp(lp, G, GLP_ON, s, t, 0);
       
  2337       glp_delete_graph(G);
       
  2338       glp_write_lp(lp, NULL, "maxflow.lp");
       
  2339       glp_delete_prob(lp);
       
  2340       return 0;
       
  2341 }
       
  2342 \end{verbatim}
       
  2343 \end{footnotesize}
       
  2344 
       
  2345 If `\verb|sample.max|' is the example data file from the previous
       
  2346 subsection, the output `\verb|maxflow.lp|' may look like follows:
       
  2347 
       
  2348 \begin{footnotesize}
       
  2349 \begin{verbatim}
       
  2350 Maximize
       
  2351  obj: + x(1,4) + x(1,2)
       
  2352 
       
  2353 Subject To
       
  2354  r_1: + x(1,2) + x(1,4) >= 0
       
  2355  r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0
       
  2356  r_3: + x(3,5) + x(3,8) - x(2,3) = 0
       
  2357  r_4: + x(4,5) - x(2,4) - x(1,4) = 0
       
  2358  r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0
       
  2359  r_6: + x(6,7) + x(6,8) - x(5,6) = 0
       
  2360  r_7: + x(7,9) - x(6,7) - x(5,7) = 0
       
  2361  r_8: + x(8,9) - x(6,8) - x(3,8) = 0
       
  2362  r_9: - x(8,9) - x(7,9) <= 0
       
  2363 
       
  2364 Bounds
       
  2365  0 <= x(1,4) <= 23
       
  2366  0 <= x(1,2) <= 14
       
  2367  0 <= x(2,4) <= 9
       
  2368  0 <= x(2,3) <= 10
       
  2369  0 <= x(3,8) <= 18
       
  2370  0 <= x(3,5) <= 12
       
  2371  0 <= x(4,5) <= 26
       
  2372  0 <= x(5,7) <= 4
       
  2373  0 <= x(5,6) <= 25
       
  2374  0 <= x(5,2) <= 11
       
  2375  0 <= x(6,8) <= 8
       
  2376  0 <= x(6,7) <= 7
       
  2377  0 <= x(7,9) <= 15
       
  2378  0 <= x(8,9) <= 20
       
  2379 
       
  2380 End
       
  2381 \end{verbatim}
       
  2382 \end{footnotesize}
       
  2383 
       
  2384 \subsection{glp\_maxflow\_ffalg---solve maximum flow problem with
       
  2385 Ford-Fulkerson algorithm}
       
  2386 
       
  2387 \subsubsection*{Synopsis}
       
  2388 
       
  2389 \begin{verbatim}
       
  2390 int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap,
       
  2391       double *sol, int a_x, int v_cut);
       
  2392 \end{verbatim}
       
  2393 
       
  2394 \subsubsection*{Description}
       
  2395 
       
  2396 The routine \verb|glp_mincost_ffalg| finds optimal solution to the
       
  2397 maximum flow problem with the Ford-Fulkerson algorithm.\footnote{GLPK
       
  2398 implementation of the Ford-Fulkerson algorithm is based on the following
       
  2399 book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, ``Flows in Networks,'' The
       
  2400 RAND Corp., Report\linebreak R-375-PR (August 1962), Chap. I
       
  2401 ``Static Maximal Flow,'' pp.~30-33.} Note that this routine requires all
       
  2402 the problem data to be integer-valued.
       
  2403 
       
  2404 The parameter \verb|G| is a graph (network) program object which
       
  2405 specifies the maximum flow problem instance to be solved.
       
  2406 
       
  2407 The parameter $s$ specifies the ordinal number of the source node.
       
  2408 
       
  2409 The parameter $t$ specifies the ordinal number of the sink node.
       
  2410 
       
  2411 The parameter \verb|a_cap| specifies an offset of the field of type
       
  2412 \verb|double| in the arc data block, which contains $u_{ij}$, the upper
       
  2413 bound to the arc flow (the arc capacity). This bound must be integer in
       
  2414 the range [0, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is assumed that
       
  2415 $u_{ij}=1$ for all arcs.
       
  2416 
       
  2417 The parameter \verb|sol| specifies a location, to which the routine
       
  2418 stores the objective value (that is, the total flow from $s$ to $t$)
       
  2419 found. If \verb|sol| is NULL, the objective value is not stored.
       
  2420 
       
  2421 The parameter \verb|a_x| specifies an offset of the field of type
       
  2422 \verb|double| in the arc data block, to which the routine stores
       
  2423 $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow values
       
  2424 are not stored.
       
  2425 
       
  2426 The parameter \verb|v_cut| specifies an offset of the field of type
       
  2427 \verb|int| in the vertex data block, to which the routine stores node
       
  2428 flags corresponding to the optimal solution found: if the node flag is
       
  2429 1, the node is labelled, and if the node flag is 0, the node is
       
  2430 unlabelled. The calling program may use these node flags to determine
       
  2431 the {\it minimal cut}, which is a subset of arcs whose one endpoint is
       
  2432 labelled and other is not. If \verb|v_cut| $<0$, the node flags are not
       
  2433 stored.
       
  2434 
       
  2435 Note that all solution components (the objective value and arc flows)
       
  2436 computed by the routine are always integer-valued.
       
  2437 
       
  2438 \subsubsection*{Returns}
       
  2439 
       
  2440 \def\arraystretch{1}
       
  2441 
       
  2442 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}}
       
  2443 0 & Optimal solution found.\\
       
  2444 \verb|GLP_EDATA| & Unable to start the search, because some problem
       
  2445 data are either not integer-valued or out of range.\\
       
  2446 \end{tabular}
       
  2447 
       
  2448 \subsubsection*{Example}
       
  2449 
       
  2450 The example program shown below reads the maximum flow problem instance
       
  2451 in DIMACS format from file `\verb|sample.max|', solves it using the
       
  2452 routine \verb|glp_maxflow_ffalg|, and write the solution found to the
       
  2453 standard output.
       
  2454 
       
  2455 \begin{footnotesize}
       
  2456 \begin{verbatim}
       
  2457 #include <stddef.h>
       
  2458 #include <stdio.h>
       
  2459 #include <stdlib.h>
       
  2460 #include <glpk.h>
       
  2461 
       
  2462 typedef struct { int cut; } v_data;
       
  2463 typedef struct { double cap, x; } a_data;
       
  2464 
       
  2465 #define node(v) ((v_data *)((v)->data))
       
  2466 #define arc(a)  ((a_data *)((a)->data))
       
  2467 
       
  2468 int main(void)
       
  2469 {     glp_graph *G;
       
  2470       glp_vertex *v, *w;
       
  2471       glp_arc *a;
       
  2472       int i, s, t, ret;
       
  2473       double sol;
       
  2474       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  2475       glp_read_maxflow(G, &s, &t, offsetof(a_data, cap),
       
  2476          "sample.max");
       
  2477       ret = glp_maxflow_ffalg(G, s, t, offsetof(a_data, cap),
       
  2478          &sol, offsetof(a_data, x), offsetof(v_data, cut));
       
  2479       printf("ret = %d; sol = %5g\n", ret, sol);
       
  2480       for (i = 1; i <= G->nv; i++)
       
  2481       {  v = G->v[i];
       
  2482          for (a = v->out; a != NULL; a = a->t_next)
       
  2483          {  w = a->head;
       
  2484             printf("x[%d->%d] = %5g (%d)\n", v->i, w->i,
       
  2485                arc(a)->x, node(v)->cut ^ node(w)->cut);
       
  2486          }
       
  2487       }
       
  2488       glp_delete_graph(G);
       
  2489       return 0;
       
  2490 }
       
  2491 \end{verbatim}
       
  2492 \end{footnotesize}
       
  2493 
       
  2494 If `\verb|sample.max|' is the example data file from the subsection
       
  2495 describing the routine \verb|glp_read_maxflow|, the output may look like
       
  2496 follows:
       
  2497 
       
  2498 \begin{footnotesize}
       
  2499 \begin{verbatim}
       
  2500 Reading maximum flow problem data from `sample.max'...
       
  2501 Flow network has 9 nodes and 14 arcs
       
  2502 24 lines were read
       
  2503 ret = 0; sol =    29
       
  2504 x[1->4] =    19 (0)
       
  2505 x[1->2] =    10 (0)
       
  2506 x[2->4] =     0 (0)
       
  2507 x[2->3] =    10 (1)
       
  2508 x[3->8] =    10 (0)
       
  2509 x[3->5] =     0 (1)
       
  2510 x[4->5] =    19 (0)
       
  2511 x[5->7] =     4 (1)
       
  2512 x[5->6] =    15 (0)
       
  2513 x[5->2] =     0 (0)
       
  2514 x[6->8] =     8 (1)
       
  2515 x[6->7] =     7 (1)
       
  2516 x[7->9] =    11 (0)
       
  2517 x[8->9] =    18 (0)
       
  2518 \end{verbatim}
       
  2519 \end{footnotesize}
       
  2520 
       
  2521 \newpage
       
  2522 
       
  2523 \subsection{glp\_rmfgen---Goldfarb's maximum flow problem generator}
       
  2524 
       
  2525 \subsubsection*{Synopsis}
       
  2526 
       
  2527 \begin{verbatim}
       
  2528 int glp_rmfgen(glp_graph *G, int *s, int *t, int a_cap,
       
  2529       const int parm[1+5]);
       
  2530 \end{verbatim}
       
  2531 
       
  2532 \subsubsection*{Description}
       
  2533 
       
  2534 The routine \verb|glp_rmfgen| is a GLPK version of the maximum flow
       
  2535 problem generator developed by D.~Goldfarb and
       
  2536 M.~Grigoriadis.\footnote{D.~Goldfarb and M.~D.~Grigoriadis,
       
  2537 ``A computational comparison of the Dinic and network simplex methods
       
  2538 for maximum flow.'' Annals of Op. Res. 13 (1988),
       
  2539 pp.~83-123.}$^{,}$\footnote{U.~Derigs and W.~Meier, ``Implementing
       
  2540 Goldberg's max-flow algorithm: A computational investigation.''
       
  2541 Zeitschrift f\"ur Operations Research 33 (1989),
       
  2542 pp.~383-403.}$^{,}$\footnote{The original code of RMFGEN implemented by
       
  2543 Tamas Badics is publically available from
       
  2544 {\tt <ftp://dimacs.rutgers.edu/pub/netflow/generators/network/genrmf>}.}
       
  2545 
       
  2546 The parameter \verb|G| specifies the graph object, to which the
       
  2547 generated problem data have to be stored. Note that on entry the graph
       
  2548 object is erased with the routine \verb|glp_erase_graph|.
       
  2549 
       
  2550 The pointers \verb|s| and \verb|t| specify locations, to which the
       
  2551 routine stores the source and sink node numbers, respectively. If
       
  2552 \verb|s| or \verb|t| is \verb|NULL|, corresponding node number is not
       
  2553 stored.
       
  2554 
       
  2555 The parameter \verb|a_cap| specifies an offset of the field of type
       
  2556 \verb|double| in the arc data block, to which the routine stores the arc
       
  2557 capacity. If \verb|a_cap| $<0$, the capacity is not stored.
       
  2558 
       
  2559 The array \verb|parm| contains description of the network to be
       
  2560 generated:
       
  2561 
       
  2562 \begin{tabular}{@{}lll@{}}
       
  2563 \verb|parm[0]|&           &not used\\
       
  2564 \verb|parm[1]|&\verb|seed|&random number seed (a positive integer)\\
       
  2565 \verb|parm[2]|&\verb|a   |&frame size\\
       
  2566 \verb|parm[3]|&\verb|b   |&depth\\
       
  2567 \verb|parm[4]|&\verb|c1  |&minimal arc capacity\\
       
  2568 \verb|parm[5]|&\verb|c2  |&maximal arc capacity\\
       
  2569 \end{tabular}
       
  2570 
       
  2571 \subsubsection*{Returns}
       
  2572 
       
  2573 If the instance was successfully generated, the routine
       
  2574 \verb|glp_netgen| returns zero; otherwise, if specified parameters are
       
  2575 inconsistent, the routine returns a non-zero error code.
       
  2576 
       
  2577 \newpage
       
  2578 
       
  2579 \subsubsection*{Comments\footnote{This material is based on comments
       
  2580 to the original version of RMFGEN.}}
       
  2581 
       
  2582 The generated network is as follows. It has $b$ pieces of frames of
       
  2583 size $a\times a$. (So alltogether the number of vertices is
       
  2584 $a\times a\times b$.)
       
  2585 
       
  2586 In each frame all the vertices are connected with their neighbours
       
  2587 (forth and back). In addition the vertices of a frame are connected
       
  2588 one to one with the vertices of next frame using a random permutation
       
  2589 of those vertices.
       
  2590 
       
  2591 The source is the lower left vertex of the first frame, the sink is
       
  2592 the upper right vertex of the $b$-th frame.
       
  2593 
       
  2594 \begin{verbatim}
       
  2595                               t
       
  2596                      +-------+
       
  2597                      |      .|
       
  2598                      |     . |
       
  2599                   /  |    /  |
       
  2600                  +-------+/ -+ b
       
  2601                  |    |  |/.
       
  2602                a |   -v- |/
       
  2603                  |    |  |/
       
  2604                  +-------+ 1
       
  2605                 s    a
       
  2606 \end{verbatim}
       
  2607 
       
  2608 The capacities are randomly chosen integers from the range of
       
  2609 $[c_1,c_2]$  in the case of interconnecting edges, and $c_2\cdot a^2$
       
  2610 for the in-frame edges.
       
  2611 
       
  2612 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
  2613 
       
  2614 \newpage
       
  2615 
       
  2616 \section{Assignment problem}
       
  2617 
       
  2618 \subsection{Background}
       
  2619 
       
  2620 Let there be given an undirected bipartite graph $G=(R\cup S,E)$, where
       
  2621 $R$ and $S$ are disjoint sets of vertices (nodes), and
       
  2622 $E\subseteq R\times S$ is a set of edges. Let also for each edge
       
  2623 $e=(i,j)\in E$ there be given its cost $c_{ij}$. A {\it matching}
       
  2624 (which in case of bipartite graph is also called {\it assignment})
       
  2625 $M\subseteq E$ in $G$ is a set of pairwise non-adjacent edges, that is,
       
  2626 no two edges in $M$ share a common vertex. A matching, which matches
       
  2627 all vertices of the graph, is called a {\it perfect matching}.
       
  2628 Obviously, a perfect matching in bipartite graph $G=(R\cup S,E)$
       
  2629 defines some bijection $R\leftrightarrow S$.
       
  2630 
       
  2631 The {\it assignment problem} has two different variants. In the first
       
  2632 variant the problem is to find matching (assignment) $M$, which
       
  2633 maximizes the sum:
       
  2634 $$\sum_{(i,j)\in M}c_{ij}\eqno(10)$$
       
  2635 (so this variant is also called the {\it maximum weighted bipartite
       
  2636 matching problem} or, if all $c_{ij}=1$, the {\it maximum cardinality
       
  2637 bipartite matching problem}). In the second, classic variant the
       
  2638 problem is to find {\it perfect} matching (assignment) $M$, which
       
  2639 minimizes or maximizes the sum (10).
       
  2640 
       
  2641 An example of the assignment problem, which is the maximum weighted
       
  2642 bipartite matching problem, is shown on Fig. 3.
       
  2643 
       
  2644 The maximum weighted bipartite matching problem can be naturally
       
  2645 formulated as the following LP problem:
       
  2646 
       
  2647 \medskip
       
  2648 
       
  2649 \noindent
       
  2650 \hspace{.5in}maximize
       
  2651 $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(11)$$
       
  2652 \hspace{.5in}subject to
       
  2653 $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ i\in R\eqno(12)$$
       
  2654 $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ j\in S\eqno(13)$$
       
  2655 $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E
       
  2656 \eqno(14)$$
       
  2657 
       
  2658 \medskip
       
  2659 
       
  2660 \noindent
       
  2661 where $x_{ij}=1$ means that $(i,j)\in M$, and $x_{ij}=0$ means that
       
  2662 $(i,j)\notin M$.\footnote{The constraint matrix of LP formulation
       
  2663 (11)---(14) is totally unimodular, due to which $x_{ij}\in\{0,1\}$ for
       
  2664 any basic solution.}
       
  2665 
       
  2666 \newpage
       
  2667 
       
  2668 \bigskip
       
  2669 
       
  2670 \noindent\hfil
       
  2671 \xymatrix @C=48pt
       
  2672 {v_1\ar@{-}[rr]|{_{13}}\ar@{-}[rrd]|{_{21}}\ar@{-}[rrddd]|(.2){_{20}}&&
       
  2673 v_9\\
       
  2674 v_2\ar@{-}[rr]|{_{12}}\ar@{-}[rrdd]|(.3){_{8}}
       
  2675 \ar@{-}[rrddd]|(.4){_{26}}&&v_{10}\\
       
  2676 v_3\ar@{-}[rr]|(.2){_{22}}\ar@{-}[rrdd]|(.3){_{11}}&&v_{11}\\
       
  2677 v_4\ar@{-}[rruuu]|(.6){_{12}}\ar@{-}[rr]|(.2){_{36}}
       
  2678 \ar@{-}[rrdd]|(.7){_{25}}&&v_{12}\\
       
  2679 v_5\ar@{-}[rruu]|(.42){_{41}}\ar@{-}[rru]|(.4){_{40}}
       
  2680 \ar@{-}[rr]|(.75){_{11}}\ar@{-}[rrd]|(.6){_{4}}\ar@{-}[rrdd]|{_{8}}
       
  2681 \ar@{-}[rrddd]|{_{35}}\ar@{-}[rrdddd]|{_{32}}&&v_{13}\\
       
  2682 v_6\ar@{-}[rruuuuu]|(.7){_{13}}&&v_{14}\\
       
  2683 v_7\ar@{-}[rruuuuu]|(.15){_{19}}&&v_{15}\\
       
  2684 v_8\ar@{-}[rruuuuuu]|(.25){_{39}}\ar@{-}[rruuuuu]|(.65){_{15}}&&
       
  2685 v_{16}\\
       
  2686 &&v_{17}\\
       
  2687 }
       
  2688 
       
  2689 \bigskip
       
  2690 
       
  2691 \noindent\hfil
       
  2692 Fig.~3. An example of the assignment problem.
       
  2693 
       
  2694 \bigskip
       
  2695 
       
  2696 Similarly, the perfect assignment problem can be naturally formulated
       
  2697 as the following LP problem:
       
  2698 
       
  2699 \medskip
       
  2700 
       
  2701 \noindent
       
  2702 \hspace{.5in}minimize (or maximize)
       
  2703 $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(15)$$
       
  2704 \hspace{.5in}subject to
       
  2705 $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ i\in R\eqno(16)$$
       
  2706 $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ j\in S\eqno(17)$$
       
  2707 $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E
       
  2708 \eqno(18)$$
       
  2709 
       
  2710 \medskip
       
  2711 
       
  2712 \noindent
       
  2713 where variables $x_{ij}$ have the same meaning as for (11)---(14)
       
  2714 above.
       
  2715 
       
  2716 \newpage
       
  2717 
       
  2718 In GLPK an undirected bipartite graph $G=(R\cup S,E)$ is represented as
       
  2719 directed graph $\overline{G}=(V,A)$, where $V=R\cup S$ and
       
  2720 $A=\{(i,j):(i,j)\in E\}$, i.e. every edge $(i,j)\in E$ in $G$
       
  2721 corresponds to arc $(i\rightarrow j)\in A$ in $\overline{G}$.
       
  2722 
       
  2723 \subsection{glp\_read\_asnprob---read assignment problem data in\\DIMACS
       
  2724 format}
       
  2725 
       
  2726 \subsubsection*{Synopsis}
       
  2727 
       
  2728 \begin{verbatim}
       
  2729 int glp_read_asnprob(glp_graph *G, int v_set, int a_cost,
       
  2730       const char *fname);
       
  2731 \end{verbatim}
       
  2732 
       
  2733 \subsubsection*{Description}
       
  2734 
       
  2735 The routine \verb|glp_read_asnprob| reads the assignment problem data
       
  2736 from a text file in DIMACS format.
       
  2737 
       
  2738 The parameter \verb|G| specifies the graph object, to which the problem
       
  2739 data have to be stored. Note that before reading data the current
       
  2740 content of the graph object is completely erased with the routine
       
  2741 \verb|glp_erase_graph|.
       
  2742 
       
  2743 The parameter \verb|v_set| specifies an offset of the field of type
       
  2744 \verb|int| in the vertex data block, to which the routine stores the
       
  2745 node set indicator:
       
  2746 
       
  2747 0 --- the node is in set $R$;
       
  2748 
       
  2749 1 --- the node is in set $S$.
       
  2750 
       
  2751 \noindent
       
  2752 If \verb|v_set| $<0$, the node set indicator is not stored.
       
  2753 
       
  2754 The parameter \verb|a_cost| specifies an offset of the field of type
       
  2755 \verb|double| in the arc data block, to which the routine stores the
       
  2756 edge cost $c_{ij}$. If \verb|a_cost| $<0$, the edge cost is not stored.
       
  2757 
       
  2758 The character string \verb|fname| specifies the name of a text file to
       
  2759 be read in. (If the file name name ends with the suffix `\verb|.gz|',
       
  2760 the file is assumed to be compressed, in which case the routine
       
  2761 decompresses it ``on the fly''.)
       
  2762 
       
  2763 \subsubsection*{Returns}
       
  2764 
       
  2765 If the operation was successful, the routine returns zero. Otherwise,
       
  2766 it prints an error message and returns non-zero.
       
  2767 
       
  2768 \newpage
       
  2769 
       
  2770 \subsubsection*{Example}
       
  2771 
       
  2772 \begin{footnotesize}
       
  2773 \begin{verbatim}
       
  2774 typedef struct
       
  2775 {     /* vertex data block */
       
  2776       ...
       
  2777       int set;
       
  2778       ...
       
  2779 } v_data;
       
  2780 
       
  2781 typedef struct
       
  2782 {     /* arc data block */
       
  2783       ...
       
  2784       double cost;
       
  2785       ...
       
  2786 } a_data;
       
  2787 
       
  2788 int main(void)
       
  2789 {     glp_graph *G;
       
  2790       int ret;
       
  2791       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  2792       ret = glp_read_asnprob(G, offsetof(v_data, set),
       
  2793          offsetof(a_data, cost), "sample.asn");
       
  2794       if (ret != 0) goto ...
       
  2795       ...
       
  2796 }
       
  2797 \end{verbatim}
       
  2798 \end{footnotesize}
       
  2799 
       
  2800 \subsubsection*{DIMACS assignment problem format\footnote{This
       
  2801 material is based on the paper ``The First DIMACS International
       
  2802 Algorithm Implementation Challenge: Problem Definitions and
       
  2803 Specifications'', which is publically available at
       
  2804 {\tt http://dimacs.rutgers.edu/Challenges/}.}}
       
  2805 \label{subsecasnprob}
       
  2806 
       
  2807 The DIMACS input file is a plain ASCII text file. It contains
       
  2808 {\it lines} of several types described below. A line is terminated with
       
  2809 an end-of-line character. Fields in each line are separated by at least
       
  2810 one blank space. Each line begins with a one-character designator to
       
  2811 identify the line type.
       
  2812 
       
  2813 Note that DIMACS requires all numerical quantities to be integers in
       
  2814 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be
       
  2815 floating-point numbers.
       
  2816 
       
  2817 \paragraph{Comment lines.} Comment lines give human-readable information
       
  2818 about the file and are ignored by programs. Comment lines can appear
       
  2819 anywhere in the file. Each comment line begins with a lower-case
       
  2820 character \verb|c|.
       
  2821 
       
  2822 \begin{verbatim}
       
  2823    c This is a comment line
       
  2824 \end{verbatim}
       
  2825 
       
  2826 \newpage
       
  2827 
       
  2828 \paragraph{Problem line.} There is one problem line per data file. The
       
  2829 problem line must appear before any node or arc descriptor lines. It has
       
  2830 the following format:
       
  2831 
       
  2832 \begin{verbatim}
       
  2833    p asn NODES EDGES
       
  2834 \end{verbatim}
       
  2835 
       
  2836 \noindent
       
  2837 The lower-case character \verb|p| signifies that this is a problem line.
       
  2838 The three-character problem designator \verb|asn| identifies the file as
       
  2839 containing specification information for the assignment problem.
       
  2840 The \verb|NODES| field contains an integer value specifying the total
       
  2841 number of nodes in the graph (i.e. in both sets $R$ and $S$). The
       
  2842 \verb|EDGES| field contains an integer value specifying the number of
       
  2843 edges in the graph.
       
  2844 
       
  2845 \paragraph{Node descriptors.} All node descriptor lines must appear
       
  2846 before all edge descriptor lines. The node descriptor lines lists the
       
  2847 nodes in set $R$ only, and all other nodes are assumed to be in set
       
  2848 $S$. There is one node descriptor line for each such node, with the
       
  2849 following format:
       
  2850 
       
  2851 \begin{verbatim}
       
  2852    n ID
       
  2853 \end{verbatim}
       
  2854 
       
  2855 \noindent
       
  2856 The lower-case character \verb|n| signifies that this is a node
       
  2857 descriptor line. The \verb|ID| field gives a node identification number,
       
  2858 an integer between 1 and \verb|NODES|.
       
  2859 
       
  2860 \paragraph{Edge descriptors.} There is one edge descriptor line for
       
  2861 each edge in the graph. Edge descriptor lines are of the following
       
  2862 format:
       
  2863 
       
  2864 \begin{verbatim}
       
  2865    a SRC DST COST
       
  2866 \end{verbatim}
       
  2867 
       
  2868 \noindent
       
  2869 The lower-case character \verb|a| signifies that this is an edge
       
  2870 descriptor line. For each edge $(i,j)$, where $i\in R$ and $j\in S$,
       
  2871 the \verb|SRC| field gives the identification number of vertex $i$, and
       
  2872 the \verb|DST| field gives the identification number of vertex $j$.
       
  2873 Identification numbers are integers between 1 and \verb|NODES|. The
       
  2874 \verb|COST| field contains the cost of edge $(i,j)$.
       
  2875 
       
  2876 \paragraph{Example.} Below here is an example of the data file in
       
  2877 DIMACS format corresponding to the assignment problem shown on Fig~3.
       
  2878 
       
  2879 \newpage
       
  2880 
       
  2881 \begin{footnotesize}
       
  2882 \begin{verbatim}
       
  2883 c sample.asn
       
  2884 c
       
  2885 c This is an example of the assignment problem data
       
  2886 c in DIMACS format.
       
  2887 c
       
  2888 p asn 17 22
       
  2889 c
       
  2890 n 1
       
  2891 n 2
       
  2892 n 3
       
  2893 n 4
       
  2894 n 5
       
  2895 n 6
       
  2896 n 7
       
  2897 n 8
       
  2898 c
       
  2899 a 1  9 13
       
  2900 a 1 10 21
       
  2901 a 1 12 20
       
  2902 a 2 10 12
       
  2903 a 2 12  8
       
  2904 a 2 13 26
       
  2905 a 3 11 22
       
  2906 a 3 13 11
       
  2907 a 4  9 12
       
  2908 a 4 12 36
       
  2909 a 4 14 25
       
  2910 a 5 11 41
       
  2911 a 5 12 40
       
  2912 a 5 13 11
       
  2913 a 5 14  4
       
  2914 a 5 15  8
       
  2915 a 5 16 35
       
  2916 a 5 17 32
       
  2917 a 6  9 13
       
  2918 a 7 10 19
       
  2919 a 8 10 39
       
  2920 a 8 11 15
       
  2921 c
       
  2922 c eof
       
  2923 \end{verbatim}
       
  2924 \end{footnotesize}
       
  2925 
       
  2926 \newpage
       
  2927 
       
  2928 \subsection{glp\_write\_asnprob---write assignment problem data in\\
       
  2929 DIMACS format}
       
  2930 
       
  2931 \subsubsection*{Synopsis}
       
  2932 
       
  2933 \begin{verbatim}
       
  2934 int glp_write_asnprob(glp_graph *G, int v_set, int a_cost,
       
  2935       const char *fname);
       
  2936 \end{verbatim}
       
  2937 
       
  2938 \subsubsection*{Description}
       
  2939 
       
  2940 The routine \verb|glp_write_asnprob| writes the assignment problem data
       
  2941 to a text file in DIMACS format.
       
  2942 
       
  2943 The parameter \verb|G| is the graph program object, which specifies the
       
  2944 assignment problem instance.
       
  2945 
       
  2946 The parameter \verb|v_set| specifies an offset of the field of type
       
  2947 \verb|int| in the vertex data block, which contains the node set
       
  2948 indicator:
       
  2949 
       
  2950 0 --- the node is in set $R$;
       
  2951 
       
  2952 1 --- the node is in set $S$.
       
  2953 
       
  2954 \noindent
       
  2955 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs
       
  2956 is in set $R$, and a node having no outgoing arcs is in set $S$.
       
  2957 
       
  2958 The parameter \verb|a_cost| specifies an offset of the field of type
       
  2959 \verb|double| in the arc data block, which contains $c_{ij}$, the edge
       
  2960 cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all
       
  2961 edges.
       
  2962 
       
  2963 The character string \verb|fname| specifies a name of the text file to
       
  2964 be written out. (If the file name ends with suffix `\verb|.gz|', the
       
  2965 file is assumed to be compressed, in which case the routine performs
       
  2966 automatic compression on writing it.)
       
  2967 
       
  2968 \subsubsection*{Note}
       
  2969 
       
  2970 The routine \verb|glp_write_asnprob| does not check that the specified
       
  2971 graph object correctly represents a bipartite graph. To make sure that
       
  2972 the problem data are correct, use the routine \verb|glp_check_asnprob|.
       
  2973 
       
  2974 \subsubsection*{Returns}
       
  2975 
       
  2976 If the operation was successful, the routine returns zero. Otherwise,
       
  2977 it prints an error message and returns non-zero.
       
  2978 
       
  2979 \newpage
       
  2980 
       
  2981 \subsection{glp\_check\_asnprob---check correctness of assignment
       
  2982 problem data}
       
  2983 
       
  2984 \subsubsection*{Synopsis}
       
  2985 
       
  2986 \begin{verbatim}
       
  2987 int glp_check_asnprob(glp_graph *G, int v_set);
       
  2988 \end{verbatim}
       
  2989 
       
  2990 \subsubsection*{Description}
       
  2991 
       
  2992 The routine \verb|glp_check_asnprob| checks that the specified graph
       
  2993 object \verb|G| correctly represents a bipartite graph.
       
  2994 
       
  2995 The parameter \verb|v_set| specifies an offset of the field of type
       
  2996 \verb|int| in the vertex data block, which contains the node set
       
  2997 indicator:
       
  2998 
       
  2999 0 --- the node is in set $R$;
       
  3000 
       
  3001 1 --- the node is in set $S$.
       
  3002 
       
  3003 \noindent
       
  3004 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs
       
  3005 is in set $R$, and a node having no outgoing arcs is in set $S$.
       
  3006 
       
  3007 \subsubsection*{Returns}
       
  3008 
       
  3009 The routine \verb|glp_check_asnprob| may return the following codes:
       
  3010 
       
  3011 0 --- the data are correct;
       
  3012 
       
  3013 1 --- the set indicator of some node is 0, however, that node has one
       
  3014 or more incoming arcs;
       
  3015 
       
  3016 2 --- the set indicator of some node is 1, however, that node has one
       
  3017 or more outgoing arcs;
       
  3018 
       
  3019 3 --- the set indicator of some node is invalid (neither 0 nor 1);
       
  3020 
       
  3021 4 --- some node has both incoming and outgoing arcs.
       
  3022 
       
  3023 \subsection{glp\_asnprob\_lp---convert assignment problem to LP}
       
  3024 
       
  3025 \subsubsection*{Synopsis}
       
  3026 
       
  3027 \begin{verbatim}
       
  3028 int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G,
       
  3029       int names, int v_set, int a_cost);
       
  3030 \end{verbatim}
       
  3031 
       
  3032 \subsubsection*{Description}
       
  3033 
       
  3034 The routine \verb|glp_asnprob_lp| builds LP problem, which corresponds
       
  3035 to the specified assignment problem.
       
  3036 
       
  3037 The parameter \verb|lp| is the resultant LP problem object to be built.
       
  3038 Note that on entry its current content is erased with the routine
       
  3039 \verb|glp_erase_prob|.
       
  3040 
       
  3041 The parameter \verb|form| defines which LP formulation should be used:
       
  3042 
       
  3043 \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization;
       
  3044 
       
  3045 \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization;
       
  3046 
       
  3047 \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14).
       
  3048 
       
  3049 The parameter \verb|G| is the graph program object, which specifies the
       
  3050 assignment problem instance.
       
  3051 
       
  3052 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the
       
  3053 routine uses symbolic names of the graph object components to assign
       
  3054 symbolic names to the LP problem object components. If the \verb|flag|
       
  3055 is \verb|GLP_OFF|, no symbolic names are assigned.
       
  3056 
       
  3057 The parameter \verb|v_set| specifies an offset of the field of type
       
  3058 \verb|int| in the vertex data block, which contains the node set
       
  3059 indicator:
       
  3060 
       
  3061 0 --- the node is in set $R$;
       
  3062 
       
  3063 1 --- the node is in set $S$.
       
  3064 
       
  3065 \noindent
       
  3066 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs
       
  3067 is in set $R$, and a node having no outgoing arcs is in set $S$.
       
  3068 
       
  3069 The parameter \verb|a_cost| specifies an offset of the field of type
       
  3070 \verb|double| in the arc data block, which contains $c_{ij}$, the edge
       
  3071 cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all
       
  3072 edges.
       
  3073 
       
  3074 \subsubsection*{Returns}
       
  3075 
       
  3076 If the LP problem has been successfully built, the routine
       
  3077 \verb|glp_asnprob_lp| returns zero, otherwise, non-zero (see the
       
  3078 routine \verb|glp_check_asnprob|).
       
  3079 
       
  3080 \subsubsection*{Example}
       
  3081 
       
  3082 The example program below reads the assignment problem instance in
       
  3083 DIMACS format from file `\verb|sample.asn|', converts the instance to
       
  3084 LP (11)---(14), and writes the resultant LP in CPLEX format to file
       
  3085 `\verb|matching.lp|'.
       
  3086 
       
  3087 \begin{footnotesize}
       
  3088 \begin{verbatim}
       
  3089 #include <stddef.h>
       
  3090 #include <glpk.h>
       
  3091 
       
  3092 typedef struct { int set; } v_data;
       
  3093 typedef struct { double cost; } a_data;
       
  3094 
       
  3095 int main(void)
       
  3096 {     glp_graph *G;
       
  3097       glp_prob *P;
       
  3098       G = glp_create_graph(sizeof(v_data), sizeof(a_data));
       
  3099       glp_read_asnprob(G, offsetof(v_data, set),
       
  3100          offsetof(a_data, cost), "sample.asn");
       
  3101       P = glp_create_prob();
       
  3102       glp_asnprob_lp(P, GLP_ASN_MMP, G, GLP_ON,
       
  3103          offsetof(v_data, set), offsetof(a_data, cost));
       
  3104       glp_delete_graph(G);
       
  3105       glp_write_lp(P, NULL, "matching.lp");
       
  3106       glp_delete_prob(P);
       
  3107       return 0;
       
  3108 }
       
  3109 \end{verbatim}
       
  3110 \end{footnotesize}
       
  3111 
       
  3112 If `\verb|sample.asn|' is the example data file from the subsection
       
  3113 describing the routine \verb|glp_read_asnprob|, file
       
  3114 `\verb|matching.lp|' may look like follows:
       
  3115 
       
  3116 \begin{footnotesize}
       
  3117 \begin{verbatim}
       
  3118 Maximize
       
  3119  obj: + 20 x(1,12) + 21 x(1,10) + 13 x(1,9) + 26 x(2,13) + 8 x(2,12)
       
  3120  + 12 x(2,10) + 11 x(3,13) + 22 x(3,11) + 25 x(4,14) + 36 x(4,12)
       
  3121  + 12 x(4,9) + 32 x(5,17) + 35 x(5,16) + 8 x(5,15) + 4 x(5,14)
       
  3122  + 11 x(5,13) + 40 x(5,12) + 41 x(5,11) + 13 x(6,9) + 19 x(7,10)
       
  3123  + 15 x(8,11) + 39 x(8,10)
       
  3124 
       
  3125 Subject To
       
  3126  r_1: + x(1,9) + x(1,10) + x(1,12) <= 1
       
  3127  r_2: + x(2,10) + x(2,12) + x(2,13) <= 1
       
  3128  r_3: + x(3,11) + x(3,13) <= 1
       
  3129  r_4: + x(4,9) + x(4,12) + x(4,14) <= 1
       
  3130  r_5: + x(5,11) + x(5,12) + x(5,13) + x(5,14) + x(5,15) + x(5,16)
       
  3131  + x(5,17) <= 1
       
  3132  r_6: + x(6,9) <= 1
       
  3133  r_7: + x(7,10) <= 1
       
  3134  r_8: + x(8,10) + x(8,11) <= 1
       
  3135  r_9: + x(6,9) + x(4,9) + x(1,9) <= 1
       
  3136  r_10: + x(8,10) + x(7,10) + x(2,10) + x(1,10) <= 1
       
  3137  r_11: + x(8,11) + x(5,11) + x(3,11) <= 1
       
  3138  r_12: + x(5,12) + x(4,12) + x(2,12) + x(1,12) <= 1
       
  3139  r_13: + x(5,13) + x(3,13) + x(2,13) <= 1
       
  3140  r_14: + x(5,14) + x(4,14) <= 1
       
  3141  r_15: + x(5,15) <= 1
       
  3142  r_16: + x(5,16) <= 1
       
  3143  r_17: + x(5,17) <= 1
       
  3144 
       
  3145 Bounds
       
  3146  0 <= x(1,12) <= 1
       
  3147  0 <= x(1,10) <= 1
       
  3148  0 <= x(1,9) <= 1
       
  3149  0 <= x(2,13) <= 1
       
  3150  0 <= x(2,12) <= 1
       
  3151  0 <= x(2,10) <= 1
       
  3152  0 <= x(3,13) <= 1
       
  3153  0 <= x(3,11) <= 1
       
  3154  0 <= x(4,14) <= 1
       
  3155  0 <= x(4,12) <= 1
       
  3156  0 <= x(4,9) <= 1
       
  3157  0 <= x(5,17) <= 1
       
  3158  0 <= x(5,16) <= 1
       
  3159  0 <= x(5,15) <= 1
       
  3160  0 <= x(5,14) <= 1
       
  3161  0 <= x(5,13) <= 1
       
  3162  0 <= x(5,12) <= 1
       
  3163  0 <= x(5,11) <= 1
       
  3164  0 <= x(6,9) <= 1
       
  3165  0 <= x(7,10) <= 1
       
  3166  0 <= x(8,11) <= 1
       
  3167  0 <= x(8,10) <= 1
       
  3168 
       
  3169 End
       
  3170 \end{verbatim}
       
  3171 \end{footnotesize}
       
  3172 
       
  3173 \subsection{glp\_asnprob\_okalg---solve assignment problem with
       
  3174 out-of-kilter algorithm}
       
  3175 
       
  3176 \subsubsection*{Synopsis}
       
  3177 
       
  3178 \begin{verbatim}
       
  3179 int glp_asnprob_okalg(int form, glp_graph *G, int v_set,
       
  3180       int a_cost, double *sol, int a_x);
       
  3181 \end{verbatim}
       
  3182 
       
  3183 \subsubsection*{Description}
       
  3184 
       
  3185 The routine \verb|glp_mincost_okalg| finds optimal solution to the
       
  3186 assignment problem with the out-of-kilter
       
  3187 algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm
       
  3188 is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson,
       
  3189 ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962),
       
  3190 Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this
       
  3191 routine requires all the problem data to be integer-valued.
       
  3192 
       
  3193 The parameter \verb|form| defines which LP formulation should be used:
       
  3194 
       
  3195 \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization;
       
  3196 
       
  3197 \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization;
       
  3198 
       
  3199 \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14).
       
  3200 
       
  3201 The parameter \verb|G| is the graph program object, which specifies the
       
  3202 assignment problem instance.
       
  3203 
       
  3204 The parameter \verb|v_set| specifies an offset of the field of type
       
  3205 \verb|int| in the vertex data block, which contains the node set
       
  3206 indicator:
       
  3207 
       
  3208 0 --- the node is in set $R$;
       
  3209 
       
  3210 1 --- the node is in set $S$.
       
  3211 
       
  3212 \newpage
       
  3213 
       
  3214 \noindent
       
  3215 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs
       
  3216 is in set $R$, and a node having no outgoing arcs is in set $S$.
       
  3217 
       
  3218 The parameter \verb|a_cost| specifies an offset of the field of type
       
  3219 \verb|double| in the arc data block, which contains $c_{ij}$, the edge
       
  3220 cost. This value must be integer in the range [\verb|-INT_MAX|,
       
  3221 \verb|+INT_MAX|]. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$
       
  3222 for all edges.
       
  3223 
       
  3224 The parameter \verb|sol| specifies a location, to which the routine
       
  3225 stores the objective value (that is, the total cost) found.
       
  3226 If \verb|sol| is \verb|NULL|, the objective value is not stored.
       
  3227 
       
  3228 The parameter \verb|a_x| specifies an offset of the field of type
       
  3229 \verb|int| in the arc data block, to which the routine stores $x_{ij}$.
       
  3230 If \verb|a_x| $<0$, this value is not stored.
       
  3231 
       
  3232 \subsubsection*{Returns}
       
  3233 
       
  3234 \def\arraystretch{1}
       
  3235 
       
  3236 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}}
       
  3237 0 & Optimal solution found.\\
       
  3238 \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\
       
  3239 \verb|GLP_EDATA| & Unable to start the search, because the assignment
       
  3240 problem data are either incorrect (this error is detected by the
       
  3241 routine \verb|glp_check_asnprob|), not integer-valued or out of range.\\
       
  3242 \verb|GLP_ERANGE| & The search was prematurely terminated because of
       
  3243 integer overflow.\\
       
  3244 \verb|GLP_EFAIL| & An error has been detected in the program logic.
       
  3245 (If this code is returned for your problem instance, please report to
       
  3246 \verb|<bug-glpk@gnu.org>|.)\\
       
  3247 \end{tabular}
       
  3248 
       
  3249 \subsubsection*{Comments}
       
  3250 
       
  3251 Since the out-of-kilter algorithm is designed to find a minimal cost
       
  3252 circulation, the routine \verb|glp_asnprob_okalg| converts the original
       
  3253 graph to a network suitable for this algorithm in the following
       
  3254 way:\footnote{The conversion is performed internally and does not change
       
  3255 the original graph program object passed to the routine.}
       
  3256 
       
  3257 1) it replaces each edge $(i,j)$ by arc $(i\rightarrow j)$,
       
  3258 flow $x_{ij}$ through which has zero lower bound ($l_{ij}=0$), unity
       
  3259 upper bound ($u_{ij}=1$), and per-unit cost $+c_{ij}$ (in case of
       
  3260 \verb|GLP_ASN_MIN|), or $-c_{ij}$ (in case of \verb|GLP_ASN_MAX| and
       
  3261 \verb|GLP_ASN_MMP|);
       
  3262 
       
  3263 2) then it adds one auxiliary feedback node $k$;
       
  3264 
       
  3265 \newpage
       
  3266 
       
  3267 3) for each original node $i\in R$ the routine adds auxiliary supply
       
  3268 arc $(k\rightarrow i)$, flow $x_{ki}$ through which is costless
       
  3269 ($c_{ki}=0$) and either fixed at 1 ($l_{ki}=u_{ki}=1$, in case of
       
  3270 \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound and
       
  3271 unity upper bound ($l_{ij}=0$, $u_{ij}=1$, in case of
       
  3272 \verb|GLP_ASN_MMP|);
       
  3273 
       
  3274 4) similarly, for each original node $j\in S$ the routine adds
       
  3275 auxiliary demand arc $(j\rightarrow k)$, flow $x_{jk}$ through which is
       
  3276 costless ($c_{jk}=0$) and either fixed at 1 ($l_{jk}=u_{jk}=1$, in case
       
  3277 of \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound
       
  3278 and unity upper bound ($l_{jk}=0$, $u_{jk}=1$, in case of
       
  3279 \verb|GLP_ASN_MMP|).
       
  3280 
       
  3281 \subsubsection*{Example}
       
  3282 
       
  3283 The example program shown below reads the assignment problem instance
       
  3284 in DIMACS format from file `\verb|sample.asn|', solves it by using the
       
  3285 routine \verb|glp_asnprob_okalg|, and writes the solution found to the
       
  3286 standard output.
       
  3287 
       
  3288 \begin{footnotesize}
       
  3289 \begin{verbatim}
       
  3290 #include <stddef.h>
       
  3291 #include <stdio.h>
       
  3292 #include <stdlib.h>
       
  3293 #include <glpk.h>
       
  3294 
       
  3295 typedef struct { int set; } v_data;
       
  3296 typedef struct { double cost; int x; } e_data;
       
  3297 
       
  3298 #define node(v) ((v_data *)((v)->data))
       
  3299 #define edge(e) ((e_data *)((e)->data))
       
  3300 
       
  3301 int main(void)
       
  3302 {     glp_graph *G;
       
  3303       glp_vertex *v;
       
  3304       glp_arc *e;
       
  3305       int i, ret;
       
  3306       double sol;
       
  3307       G = glp_create_graph(sizeof(v_data), sizeof(e_data));
       
  3308       glp_read_asnprob(G, offsetof(v_data, set),
       
  3309          offsetof(e_data, cost), "sample.asn");
       
  3310       ret = glp_asnprob_okalg(GLP_ASN_MMP, G,
       
  3311          offsetof(v_data, set), offsetof(e_data, cost), &sol,
       
  3312          offsetof(e_data, x));
       
  3313       printf("ret = %d; sol = %5g\n", ret, sol);
       
  3314       for (i = 1; i <= G->nv; i++)
       
  3315       {  v = G->v[i];
       
  3316          for (e = v->out; e != NULL; e = e->t_next)
       
  3317             printf("edge %2d %2d: x = %d; c = %g\n",
       
  3318                e->tail->i, e->head->i, edge(e)->x, edge(e)->cost);
       
  3319       }
       
  3320       glp_delete_graph(G);
       
  3321       return 0;
       
  3322 }
       
  3323 \end{verbatim}
       
  3324 \end{footnotesize}
       
  3325 
       
  3326 If `\verb|sample.asn|' is the example data file from the subsection
       
  3327 describing the routine \verb|glp_read_asnprob|, the output may look
       
  3328 like follows:
       
  3329 
       
  3330 \begin{footnotesize}
       
  3331 \begin{verbatim}
       
  3332 Reading assignment problem data from `sample.asn'...
       
  3333 Assignment problem has 8 + 9 = 17 nodes and 22 arcs
       
  3334 38 lines were read
       
  3335 ret = 0; sol =   180
       
  3336 edge  1 12: x = 1; c = 20
       
  3337 edge  1 10: x = 0; c = 21
       
  3338 edge  1  9: x = 0; c = 13
       
  3339 edge  2 13: x = 1; c = 26
       
  3340 edge  2 12: x = 0; c = 8
       
  3341 edge  2 10: x = 0; c = 12
       
  3342 edge  3 13: x = 0; c = 11
       
  3343 edge  3 11: x = 1; c = 22
       
  3344 edge  4 14: x = 1; c = 25
       
  3345 edge  4 12: x = 0; c = 36
       
  3346 edge  4  9: x = 0; c = 12
       
  3347 edge  5 17: x = 0; c = 32
       
  3348 edge  5 16: x = 1; c = 35
       
  3349 edge  5 15: x = 0; c = 8
       
  3350 edge  5 14: x = 0; c = 4
       
  3351 edge  5 13: x = 0; c = 11
       
  3352 edge  5 12: x = 0; c = 40
       
  3353 edge  5 11: x = 0; c = 41
       
  3354 edge  6  9: x = 1; c = 13
       
  3355 edge  7 10: x = 0; c = 19
       
  3356 edge  8 11: x = 0; c = 15
       
  3357 edge  8 10: x = 1; c = 39
       
  3358 \end{verbatim}
       
  3359 \end{footnotesize}
       
  3360 
       
  3361 \newpage
       
  3362 
       
  3363 \subsection{glp\_asnprob\_hall---find bipartite matching of maximum
       
  3364 cardinality}
       
  3365 
       
  3366 \subsubsection*{Synopsis}
       
  3367 
       
  3368 \begin{verbatim}
       
  3369 int glp_asnprob_hall(glp_graph *G, int v_set, int a_x);
       
  3370 \end{verbatim}
       
  3371 
       
  3372 \subsubsection*{Description}
       
  3373 
       
  3374 The routine \verb|glp_asnprob_hall| finds a matching of maximal
       
  3375 cardinality in the specified bipartite graph. It uses a version of the
       
  3376 Fortran routine \verb|MC21A| developed by
       
  3377 I.~S.~Duff\footnote{I.~S.~Duff, Algorithm 575: Permutations for
       
  3378 zero-free diagonal, ACM Trans. on Math. Softw. 7 (1981), pp.~387-390.},
       
  3379 which implements Hall's algorithm.\footnote{M.~Hall, ``An Algorithm for
       
  3380 Distinct Representatives,'' Am. Math. Monthly 63 (1956), pp.~716-717.}
       
  3381 
       
  3382 The parameter \verb|G| is a pointer to the graph program object.
       
  3383 
       
  3384 The parameter \verb|v_set| specifies an offset of the field of type
       
  3385 \verb|int| in the vertex data block, which contains the node set
       
  3386 indicator:
       
  3387 
       
  3388 0 --- the node is in set $R$;
       
  3389 
       
  3390 1 --- the node is in set $S$.
       
  3391 
       
  3392 \noindent
       
  3393 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs
       
  3394 is in set $R$, and a node having no outgoing arcs is in set $S$.
       
  3395 
       
  3396 The parameter \verb|a_x| specifies an offset of the field of type
       
  3397 \verb|int| in the arc data block, to which the routine stores $x_{ij}$.
       
  3398 If \verb|a_x| $<0$, this value is not stored.
       
  3399 
       
  3400 \subsubsection*{Returns}
       
  3401 
       
  3402 The routine \verb|glp_asnprob_hall| returns the cardinality of the
       
  3403 matching found. However, if the specified graph is incorrect (as
       
  3404 detected by the routine \verb|glp_check_asnprob|), this routine returns
       
  3405 a negative value.
       
  3406 
       
  3407 \subsubsection*{Comments}
       
  3408 
       
  3409 The same solution may be obtained with the routine
       
  3410 \verb|glp_asnprob_okalg| (for LP formulation \verb|GLP_ASN_MMP| and
       
  3411 all edge costs equal to 1). However, the routine \verb|glp_asnprob_hall|
       
  3412 is much faster.
       
  3413 
       
  3414 \newpage
       
  3415 
       
  3416 \subsubsection*{Example}
       
  3417 
       
  3418 The example program shown below reads the assignment problem instance
       
  3419 in DIMACS format from file `\verb|sample.asn|', finds a bipartite
       
  3420 matching of maximal cardinality by using the routine
       
  3421 \verb|glp_asnprob_hall|, and writes the solution found to the standard
       
  3422 output.
       
  3423 
       
  3424 \begin{footnotesize}
       
  3425 \begin{verbatim}
       
  3426 #include <stddef.h>
       
  3427 #include <stdio.h>
       
  3428 #include <stdlib.h>
       
  3429 #include <glpk.h>
       
  3430 
       
  3431 typedef struct { int set; } v_data;
       
  3432 typedef struct { int x;   } e_data;
       
  3433 
       
  3434 #define node(v) ((v_data *)((v)->data))
       
  3435 #define edge(e) ((e_data *)((e)->data))
       
  3436 
       
  3437 int main(void)
       
  3438 {     glp_graph *G;
       
  3439       glp_vertex *v;
       
  3440       glp_arc *e;
       
  3441       int i, card;
       
  3442       G = glp_create_graph(sizeof(v_data), sizeof(e_data));
       
  3443       glp_read_asnprob(G, offsetof(v_data, set), -1,
       
  3444          "sample.asn");
       
  3445       card = glp_asnprob_hall(G, offsetof(v_data, set),
       
  3446          offsetof(e_data, x));
       
  3447       printf("card = %d\n", card);
       
  3448       for (i = 1; i <= G->nv; i++)
       
  3449       {  v = G->v[i];
       
  3450          for (e = v->out; e != NULL; e = e->t_next)
       
  3451             printf("edge %2d %2d: x = %d\n",
       
  3452                e->tail->i, e->head->i, edge(e)->x);
       
  3453       }
       
  3454       glp_delete_graph(G);
       
  3455       return 0;
       
  3456 }
       
  3457 \end{verbatim}
       
  3458 \end{footnotesize}
       
  3459 
       
  3460 If `\verb|sample.asn|' is the example data file from the subsection
       
  3461 describing the routine \verb|glp_read_asnprob|, the output may look
       
  3462 like follows:
       
  3463 
       
  3464 \begin{footnotesize}
       
  3465 \begin{verbatim}
       
  3466 Reading assignment problem data from `sample.asn'...
       
  3467 Assignment problem has 8 + 9 = 17 nodes and 22 arcs
       
  3468 38 lines were read
       
  3469 card = 7
       
  3470 edge  1 12: x = 1
       
  3471 edge  1 10: x = 0
       
  3472 edge  1  9: x = 0
       
  3473 edge  2 13: x = 1
       
  3474 edge  2 12: x = 0
       
  3475 edge  2 10: x = 0
       
  3476 edge  3 13: x = 0
       
  3477 edge  3 11: x = 1
       
  3478 edge  4 14: x = 1
       
  3479 edge  4 12: x = 0
       
  3480 edge  4  9: x = 0
       
  3481 edge  5 17: x = 1
       
  3482 edge  5 16: x = 0
       
  3483 edge  5 15: x = 0
       
  3484 edge  5 14: x = 0
       
  3485 edge  5 13: x = 0
       
  3486 edge  5 12: x = 0
       
  3487 edge  5 11: x = 0
       
  3488 edge  6  9: x = 1
       
  3489 edge  7 10: x = 1
       
  3490 edge  8 11: x = 0
       
  3491 edge  8 10: x = 0
       
  3492 \end{verbatim}
       
  3493 \end{footnotesize}
       
  3494 
       
  3495 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
  3496 
       
  3497 \newpage
       
  3498 
       
  3499 \section{Critical path problem}
       
  3500 
       
  3501 \subsection{Background}
       
  3502 
       
  3503 The {\it critical path problem} (CPP) is stated as follows. Let there
       
  3504 be given a project $J$, which a set of jobs (tasks, activities, etc.).
       
  3505 Performing each job $i\in J$ requires time $t_i\geq 0$. Besides, over
       
  3506 the set $J$ there is given a precedence relation $R\subseteq J\times J$,
       
  3507 where $(i,j)\in R$ means that job $i$ immediately precedes job $j$, i.e.
       
  3508 performing job $j$ cannot start until job $i$ has been completely
       
  3509 performed. The problem is to find starting times $x_i$ for each job
       
  3510 $i\in J$, which satisfy to the precedence relation and minimize the
       
  3511 total duration (makespan) of the project.
       
  3512 
       
  3513 The following is an example of the critical path problem:
       
  3514 
       
  3515 \begin{center}
       
  3516 \begin{tabular}{|c|l|c|c|}
       
  3517 \hline
       
  3518 Job&Desription&Time&Predecessors\\
       
  3519 \hline
       
  3520 A&Excavate&3&---\\
       
  3521 B&Lay foundation&4&A\\
       
  3522 C&Rough plumbing&3&B\\
       
  3523 D&Frame&10&B\\
       
  3524 E&Finish exterior&8&D\\
       
  3525 F&Install HVAC&4&D\\
       
  3526 G&Rough electric&6&D\\
       
  3527 H&Sheet rock&8&C, E, F, G\\
       
  3528 I&Install cabinets&5&H\\
       
  3529 J&Paint&5&H\\
       
  3530 K&Final plumbing&4&I\\
       
  3531 L&Final electric&2&J\\
       
  3532 M&Install flooring&4&K, L\\
       
  3533 \hline
       
  3534 \end{tabular}
       
  3535 \end{center}
       
  3536 
       
  3537 Obviously, the project along with the precedence relation can be
       
  3538 represented as a directed graph $G=(J,R)$ called {\it project network},
       
  3539 where each node $i\in J$ corresponds to a job, and arc
       
  3540 $(i\rightarrow j)\in R$ means that job $i$ immediately precedes job
       
  3541 $j$.\footnote{There exists another network representation of the
       
  3542 critical path problem, where jobs correspond to arcs while nodes
       
  3543 correspond to events introduced to express the precedence relation.
       
  3544 That representation, however, is much less convenient than the one,
       
  3545 where jobs are represented as nodes of the network.} The project network
       
  3546 for the example above is shown on Fig.~4.
       
  3547 
       
  3548 May note that the project network must be acyclic; otherwise, it would
       
  3549 be impossible to satisfy to the precedence relation for any job that
       
  3550 belongs to a cycle.
       
  3551 
       
  3552 \newpage
       
  3553 
       
  3554 \xymatrix
       
  3555 {&&&C|3\ar[rd]&&I|5\ar[r]&K|4\ar[rd]&\\
       
  3556 A|3\ar[r]&B|4\ar[rru]\ar[rd]&&E|8\ar[r]&H|8\ar[ru]\ar[rd]&&&M|4\\
       
  3557 &&D|10\ar[ru]\ar[r]\ar[rd]&F|4\ar[ru]&&J|5\ar[r]&L|2\ar[ru]&\\
       
  3558 &&&G|6\ar[ruu]&&&&\\
       
  3559 }
       
  3560 
       
  3561 \bigskip
       
  3562 
       
  3563 \noindent\hfil
       
  3564 Fig.~4. An example of the project network.
       
  3565 
       
  3566 \bigskip
       
  3567 
       
  3568 The critical path problem can be naturally formulated as the following
       
  3569 LP problem:
       
  3570 
       
  3571 \medskip
       
  3572 
       
  3573 \noindent
       
  3574 \hspace{.5in}minimize
       
  3575 $$z\eqno(19)$$
       
  3576 \hspace{.5in}subject to
       
  3577 $$x_i+t_i\leq z\ \ \ \hbox{for all}\ i\in J\ \ \ \ \eqno(20)$$
       
  3578 $$x_i+t_i\leq x_j\ \ \ \hbox{for all}\ (i,j)\in R\eqno(21)$$
       
  3579 $$x_i\geq 0\ \ \ \ \ \ \ \hbox{for all}\ i\in J\ \ \eqno(22)$$
       
  3580 
       
  3581 The inequality constraints (21), which are active in the optimal
       
  3582 solution, define so called {\it critical path} having the following
       
  3583 property: the minimal project duration $z$ can be decreased only by
       
  3584 decreasing the times $t_j$ for jobs on the critical path, and delaying
       
  3585 any critical job delays the entire project.
       
  3586 
       
  3587 \subsection{glp\_cpp---solve critical path problem}
       
  3588 
       
  3589 \subsubsection{Synopsis}
       
  3590 
       
  3591 \begin{verbatim}
       
  3592 double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls);
       
  3593 \end{verbatim}
       
  3594 
       
  3595 \subsubsection{Description}
       
  3596 
       
  3597 The routine \verb|glp_cpp| solves the critical path problem represented
       
  3598 in the form of the project network.
       
  3599 
       
  3600 The parameter \verb|G| is a pointer to the graph object, which
       
  3601 specifies the project network. This graph must be acyclic. Multiple
       
  3602 arcs are allowed being considered as single arcs.
       
  3603 
       
  3604 The parameter \verb|v_t| specifies an offset of the field of type
       
  3605 \verb|double| in the vertex data block, which contains time $t_i\geq 0$
       
  3606 needed to perform corresponding job $j\in J$. If \verb|v_t| $<0$, it is
       
  3607 assumed that $t_i=1$ for all jobs.
       
  3608 
       
  3609 The parameter \verb|v_es| specifies an offset of the field of type
       
  3610 \verb|double| in the vertex data block, to which the routine stores
       
  3611 the {\it earliest start time} for corresponding job. If \verb|v_es|
       
  3612 $<0$, this time is not stored.
       
  3613 
       
  3614 The parameter \verb|v_ls| specifies an offset of the field of type
       
  3615 \verb|double| in the vertex data block, to which the routine stores
       
  3616 the {\it latest start time} for corresponding job. If \verb|v_ls|
       
  3617 $<0$, this time is not stored.
       
  3618 
       
  3619 The difference between the latest and earliest start times of some job
       
  3620 is called its {\it time reserve}. Delaying a job within its time reserve
       
  3621 does not affect the project duration, so if the time reserve is zero,
       
  3622 the corresponding job is critical.
       
  3623 
       
  3624 \subsubsection{Returns}
       
  3625 
       
  3626 The routine \verb|glp_cpp| returns the minimal project duration, i.e.
       
  3627 minimal time needed to perform all jobs in the project.
       
  3628 
       
  3629 \subsubsection{Example}
       
  3630 
       
  3631 The example program below solves the critical path problem shown on
       
  3632 Fig.~4 by using the routine \verb|glp_cpp| and writes the solution found
       
  3633 to the standard output.
       
  3634 
       
  3635 \begin{footnotesize}
       
  3636 \begin{verbatim}
       
  3637 #include <stddef.h>
       
  3638 #include <stdio.h>
       
  3639 #include <stdlib.h>
       
  3640 #include <glpk.h>
       
  3641 
       
  3642 typedef struct { double t, es, ls; } v_data;
       
  3643 
       
  3644 #define node(v) ((v_data *)((v)->data))
       
  3645 
       
  3646 int main(void)
       
  3647 {     glp_graph *G;
       
  3648       int i;
       
  3649       double t, es, ef, ls, lf, total;
       
  3650       G = glp_create_graph(sizeof(v_data), 0);
       
  3651       glp_add_vertices(G, 13);
       
  3652       node(G->v[1])->t = 3;   /* A: Excavate */
       
  3653       node(G->v[2])->t = 4;   /* B: Lay foundation */
       
  3654       node(G->v[3])->t = 3;   /* C: Rough plumbing */
       
  3655       node(G->v[4])->t = 10;  /* D: Frame */
       
  3656       node(G->v[5])->t = 8;   /* E: Finish exterior */
       
  3657       node(G->v[6])->t = 4;   /* F: Install HVAC */
       
  3658       node(G->v[7])->t = 6;   /* G: Rough elecrtic */
       
  3659       node(G->v[8])->t = 8;   /* H: Sheet rock */
       
  3660       node(G->v[9])->t = 5;   /* I: Install cabinets */
       
  3661       node(G->v[10])->t = 5;  /* J: Paint */
       
  3662       node(G->v[11])->t = 4;  /* K: Final plumbing */
       
  3663       node(G->v[12])->t = 2;  /* L: Final electric */
       
  3664       node(G->v[13])->t = 4;  /* M: Install flooring */
       
  3665       glp_add_arc(G, 1, 2);   /* A precedes B */
       
  3666       glp_add_arc(G, 2, 3);   /* B precedes C */
       
  3667       glp_add_arc(G, 2, 4);   /* B precedes D */
       
  3668       glp_add_arc(G, 4, 5);   /* D precedes E */
       
  3669       glp_add_arc(G, 4, 6);   /* D precedes F */
       
  3670       glp_add_arc(G, 4, 7);   /* D precedes G */
       
  3671       glp_add_arc(G, 3, 8);   /* C precedes H */
       
  3672       glp_add_arc(G, 5, 8);   /* E precedes H */
       
  3673       glp_add_arc(G, 6, 8);   /* F precedes H */
       
  3674       glp_add_arc(G, 7, 8);   /* G precedes H */
       
  3675       glp_add_arc(G, 8, 9);   /* H precedes I */
       
  3676       glp_add_arc(G, 8, 10);  /* H precedes J */
       
  3677       glp_add_arc(G, 9, 11);  /* I precedes K */
       
  3678       glp_add_arc(G, 10, 12); /* J precedes L */
       
  3679       glp_add_arc(G, 11, 13); /* K precedes M */
       
  3680       glp_add_arc(G, 12, 13); /* L precedes M */
       
  3681       total = glp_cpp(G, offsetof(v_data, t), offsetof(v_data, es),
       
  3682          offsetof(v_data, ls));
       
  3683       printf("Minimal project duration is %.2f\n\n", total);
       
  3684       printf("Job  Time      ES     EF     LS     LF\n");
       
  3685       printf("--- ------   ------ ------ ------ ------\n");
       
  3686       for (i = 1; i <= G->nv; i++)
       
  3687       {  t = node(G->v[i])->t;
       
  3688          es = node(G->v[i])->es;
       
  3689          ef = es + node(G->v[i])->t;
       
  3690          ls = node(G->v[i])->ls;
       
  3691          lf = ls + node(G->v[i])->t;
       
  3692          printf("%3d %6.2f %s %6.2f %6.2f %6.2f %6.2f\n",
       
  3693             i, t, ls - es < 0.001 ? "*" : " ", es, ef, ls, lf);
       
  3694       }
       
  3695       glp_delete_graph(G);
       
  3696       return 0;
       
  3697 }
       
  3698 \end{verbatim}
       
  3699 \end{footnotesize}
       
  3700 
       
  3701 The output from the example program shown below includes job number,
       
  3702 the time needed to perform a job, earliest start time (\verb|ES|),
       
  3703 earliest finish time (\verb|EF|), latest start time (\verb|LS|), and
       
  3704 latest finish time (\verb|LF|) for each job in the project. Critical
       
  3705 jobs are marked by asterisks.
       
  3706 
       
  3707 \newpage
       
  3708 
       
  3709 \begin{footnotesize}
       
  3710 \begin{verbatim}
       
  3711 Minimal project duration is 46.00
       
  3712 
       
  3713 Job  Time      ES     EF     LS     LF
       
  3714 --- ------   ------ ------ ------ ------
       
  3715   1   3.00 *   0.00   3.00   0.00   3.00
       
  3716   2   4.00 *   3.00   7.00   3.00   7.00
       
  3717   3   3.00     7.00  10.00  22.00  25.00
       
  3718   4  10.00 *   7.00  17.00   7.00  17.00
       
  3719   5   8.00 *  17.00  25.00  17.00  25.00
       
  3720   6   4.00    17.00  21.00  21.00  25.00
       
  3721   7   6.00    17.00  23.00  19.00  25.00
       
  3722   8   8.00 *  25.00  33.00  25.00  33.00
       
  3723   9   5.00 *  33.00  38.00  33.00  38.00
       
  3724  10   5.00    33.00  38.00  35.00  40.00
       
  3725  11   4.00 *  38.00  42.00  38.00  42.00
       
  3726  12   2.00    38.00  40.00  40.00  42.00
       
  3727  13   4.00 *  42.00  46.00  42.00  46.00
       
  3728 \end{verbatim}
       
  3729 \end{footnotesize}
       
  3730 
       
  3731 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
  3732 
       
  3733 \chapter{Graph Optimization API Routines}
       
  3734 
       
  3735 \section{Maximum clique problem}
       
  3736 
       
  3737 \subsection{Background}
       
  3738 
       
  3739 The {\it maximum clique problem (MCP)} is a classic combinatorial
       
  3740 optimization problem. Given an undirected graph $G=(V,E)$, where $V$ is
       
  3741 a set of vertices, and $E$ is a set of edges, this problem is to find
       
  3742 the largest {\it clique} $C\subseteq G$, i.e. the largest induced
       
  3743 complete subgraph. A generalization of this problem is the {\it maximum
       
  3744 weight clique problem (MWCP)}, which is to find a clique $C\subseteq G$
       
  3745 of the largest weight $\displaystyle\sum_{v\in C}w(v)\rightarrow\max$,
       
  3746 where $w(v)$ is a weight of vertex $v\in V$.
       
  3747 
       
  3748 An example of the maximum weight clique problem is shown on Fig.~5.
       
  3749 
       
  3750 \begin{figure}
       
  3751 \noindent\hfil
       
  3752 \begin{tabular}{c}
       
  3753 {\xymatrix %@C=16pt
       
  3754 {&&&{v_1}\ar@{-}[lllddd]\ar@{-}[llddddd]\ar@{-}[dddddd]
       
  3755 \ar@{-}[rrrddd]&&&\\
       
  3756 &{v_2}\ar@{-}[rrrr]\ar@{-}[rrrrdddd]\ar@{-}[rrddddd]\ar@{-}[dddd]&&&&
       
  3757 {v_3}\ar@{-}[llllldd]\ar@{-}[lllldddd]\ar@{-}[dddd]&\\
       
  3758 &&&&&&\\
       
  3759 {v_4}\ar@{-}[rrrrrr]\ar@{-}[rrrddd]&&&&&&{v_5}\ar@{-}[lllddd]
       
  3760 \ar@{-}[ldd]\\
       
  3761 &&&&&&\\
       
  3762 &{v_6}\ar@{-}[rrrr]&&&&{v_7}&\\
       
  3763 &&&{v_8}&&&\\
       
  3764 }}
       
  3765 \end{tabular}
       
  3766 \begin{tabular}{r@{\ }c@{\ }l}
       
  3767 $w(v_1)$&=&3\\$w(v_2)$&=&4\\$w(v_3)$&=&8\\$w(v_4)$&=&1\\
       
  3768 $w(v_5)$&=&5\\$w(v_6)$&=&2\\$w(v_7)$&=&1\\$w(v_8)$&=&3\\
       
  3769 \end{tabular}
       
  3770 
       
  3771 \begin{center}
       
  3772 Fig.~5. An example of the maximum weight clique problem.
       
  3773 \end{center}
       
  3774 \end{figure}
       
  3775 
       
  3776 \subsection{glp\_wclique\_exact---find maximum weight clique with exact
       
  3777 algorithm}
       
  3778 
       
  3779 \subsubsection*{Synopsis}
       
  3780 
       
  3781 \begin{verbatim}
       
  3782 int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol,
       
  3783       int v_set);
       
  3784 \end{verbatim}
       
  3785 
       
  3786 \subsection*{Description}
       
  3787 
       
  3788 The routine {\it glp\_wclique\_exact} finds a maximum weight clique in
       
  3789 the specified undirected graph with the exact algorithm developed by
       
  3790 Patric \"Osterg{\aa}rd.\footnote{P.~R.~J.~\"Osterg{\aa}rd, A new
       
  3791 algorithm for the maximum-weight clique problem, Nordic J. of Computing,
       
  3792 Vol.~8, No.~4, 2001, pp.~424--36.}
       
  3793 
       
  3794 The parameter $G$ is the program object, which specifies an undirected
       
  3795 graph. Each arc $(x\rightarrow y)$ in $G$ is considered as edge
       
  3796 $(x,y)$, self-loops are ignored, and multiple edges, if present, are
       
  3797 replaced (internally) by simple edges.
       
  3798 
       
  3799 The parameter {\it v\_wgt} specifies an offset of the field of type
       
  3800 {\bf double} in the vertex data block, which contains a weight of
       
  3801 corresponding vertex. Vertex weights must be integer-valued in the
       
  3802 range $[0,$ {\it INT\_MAX}$]$. If {\it v\_wgt} $<0$, it is assumed that
       
  3803 all vertices of the graph have the weight 1.
       
  3804 
       
  3805 The parameter {\it sol} specifies a location, to which the routine
       
  3806 stores the weight of the clique found (the clique weight is the sum
       
  3807 of weights of all vertices included in the clique.) If {\it sol} is
       
  3808 {\it NULL}, the solution is not stored.
       
  3809 
       
  3810 The parameter {\it v\_set} specifies an offset of the field of type
       
  3811 {\bf int} in the vertex data block, to which the routines stores a
       
  3812 vertex flag: 1 means that the corresponding vertex is included in the
       
  3813 clique found, and 0 otherwise. If {\it v\_set} $<0$, vertex flags are
       
  3814 not stored.
       
  3815 
       
  3816 \subsubsection*{Returns}
       
  3817 
       
  3818 \def\arraystretch{1}
       
  3819 
       
  3820 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}}
       
  3821 0 & Optimal solution found.\\
       
  3822 \verb|GLP_EDATA| & Unable to start the search, because some vertex
       
  3823 weights are either not integer-valued or out of range. This code is
       
  3824 also returned if the sum of weights of all vertices exceeds
       
  3825 {\it INT\_MAX}. \\
       
  3826 \end{tabular}
       
  3827 
       
  3828 \subsubsection*{Notes}
       
  3829 
       
  3830 \noindent\indent
       
  3831 1. The routine {\it glp\_wclique\_exact} finds exact solution. Since
       
  3832 both MCP and MWCP problems are NP-complete, the algorithm may require
       
  3833 exponential time in worst cases.
       
  3834 
       
  3835 2. Internally the specified graph is converted to an adjacency matrix
       
  3836 in {\it dense} format. This requires about $|V|^2/16$ bytes of memory,
       
  3837 where $|V|$ is the number of vertices in the graph.
       
  3838 
       
  3839 \subsubsection*{Example}
       
  3840 
       
  3841 The example program shown below reads a MWCP instance in DIMACS
       
  3842 clique/coloring format from file `\verb|sample.clq|', finds the clique
       
  3843 of largest weight, and writes the solution found to the standard output.
       
  3844 
       
  3845 \begin{footnotesize}
       
  3846 \begin{verbatim}
       
  3847 #include <stddef.h>
       
  3848 #include <stdio.h>
       
  3849 #include <stdlib.h>
       
  3850 #include <glpk.h>
       
  3851 
       
  3852 typedef struct { double wgt; int set; } v_data;
       
  3853 
       
  3854 #define vertex(v) ((v_data *)((v)->data))
       
  3855 
       
  3856 int main(void)
       
  3857 {     glp_graph *G;
       
  3858       glp_vertex *v;
       
  3859       int i, ret;
       
  3860       double sol;
       
  3861       G = glp_create_graph(sizeof(v_data), 0);
       
  3862       glp_read_ccdata(G, offsetof(v_data, wgt), "sample.clq");
       
  3863       ret = glp_wclique_exact(G, offsetof(v_data, wgt), &sol,
       
  3864          offsetof(v_data, set));
       
  3865       printf("ret = %d; sol = %g\n", ret, sol);
       
  3866       for (i = 1; i <= G->nv; i++)
       
  3867       {  v = G->v[i];
       
  3868          printf("vertex %d: weight = %g, flag = %d\n",
       
  3869             i, vertex(v)->wgt, vertex(v)->set);
       
  3870       }
       
  3871       glp_delete_graph(G);
       
  3872       return 0;
       
  3873 }
       
  3874 \end{verbatim}
       
  3875 \end{footnotesize}
       
  3876 
       
  3877 \noindent
       
  3878 For the example shown on Fig.~5 the data file may look like follows:
       
  3879 
       
  3880 \begin{footnotesize}
       
  3881 \begin{verbatim}
       
  3882 c sample.clq
       
  3883 c
       
  3884 c This is an example of the maximum weight clique
       
  3885 c problem in DIMACS clique/coloring format.
       
  3886 c
       
  3887 p edge 8 16
       
  3888 n 1 3
       
  3889 n 2 4
       
  3890 n 3 8
       
  3891 n 5 5
       
  3892 n 6 2
       
  3893 n 8 3
       
  3894 e 1 4
       
  3895 e 1 5
       
  3896 e 1 6
       
  3897 e 1 8
       
  3898 e 2 3
       
  3899 e 2 6
       
  3900 e 2 7
       
  3901 e 2 8
       
  3902 e 3 4
       
  3903 e 3 6
       
  3904 e 3 7
       
  3905 e 4 5
       
  3906 e 4 8
       
  3907 e 5 7
       
  3908 e 5 8
       
  3909 e 6 7
       
  3910 c
       
  3911 c eof
       
  3912 \end{verbatim}
       
  3913 \end{footnotesize}
       
  3914 
       
  3915 \noindent
       
  3916 The corresponding output from the example program is the following:
       
  3917 
       
  3918 \begin{footnotesize}
       
  3919 \begin{verbatim}
       
  3920 Reading graph from `sample.clq'...
       
  3921 Graph has 8 vertices and 16 edges
       
  3922 28 lines were read
       
  3923 ret = 0; sol = 15
       
  3924 vertex 1: weight = 3, flag = 0
       
  3925 vertex 2: weight = 4, flag = 1
       
  3926 vertex 3: weight = 8, flag = 1
       
  3927 vertex 4: weight = 1, flag = 0
       
  3928 vertex 5: weight = 5, flag = 0
       
  3929 vertex 6: weight = 2, flag = 1
       
  3930 vertex 7: weight = 1, flag = 1
       
  3931 vertex 8: weight = 3, flag = 0
       
  3932 \end{verbatim}
       
  3933 \end{footnotesize}
       
  3934 
       
  3935 \end{document}