<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1405-7743</journal-id>
<journal-title><![CDATA[Ingeniería, investigación y tecnología]]></journal-title>
<abbrev-journal-title><![CDATA[Ing. invest. y tecnol.]]></abbrev-journal-title>
<issn>1405-7743</issn>
<publisher>
<publisher-name><![CDATA[Universidad Nacional Autónoma de México, Facultad de Ingeniería]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1405-77432006000100004</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Diseño de un programa en Logo para calcular flujos máximos en redes]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Murray-Lasso]]></surname>
<given-names><![CDATA[M.A.]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,UNAM Facultad de Ingeniería División de Ingeniería Mecánica e Industrial]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>03</month>
<year>2006</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>03</month>
<year>2006</year>
</pub-date>
<volume>7</volume>
<numero>1</numero>
<fpage>45</fpage>
<lpage>55</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_arttext&amp;pid=S1405-77432006000100004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_abstract&amp;pid=S1405-77432006000100004&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.mx/scielo.php?script=sci_pdf&amp;pid=S1405-77432006000100004&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Se muestran los pormenores del diseño de un programa Logo para calcular flujos máximos entre pares de puntos sobre redes orientadas, cuyas ramas tienen un límite superior al flujo que puede circular por ellas. Para el diseño del programa se utilizan Listas, que es la única estructura de datos soportada por Logo, pero que es muy adecuada para representar y manipular redes que no están muy densamente conectadas, que es el caso más frecuente en redes de flujo. Dado que Logo no soporta arreglos, y éstos resultan convenientes en el programa, se muestra la manera de implementarlos utilizando la flexibilidad de Logo en el manejo de los nombres de las variables. También se proporcionan listas de programas en Logo Writer que implementan los algoritmos de etiquetado de Ford y Fulkerson. Como apoyo a la docencia se incluyen rutinas que se pueden utilizar como instrumentos que le permiten al maestro y alumno seguir las variaciones de las estructuras durante el proceso. Finalmente, se resuelven en detalle dos ejemplos ilustrativos.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[The details of the design of a Logo program to calculate maximum flows between pairs of points in oriented networks with branches having upper limits to flow. For the design Lists, which are the only data strustures supported by Logo, buy which are quite appropriate to represent and handle networks not densely connected, the most common case in flow networks are utilised. Since Logo does not support arrays and they are convenient in the program, it is shown to implement them taking advantage of the flexibility of Logo in the handling of the names of variables. Listings of Logo Writer programs implementing the labelling algorithms of Ford and Fulkerson are provided. As teaching aids, routines that can be used as instruments to allow teachers and students to follow the variations in the structures during the process, are also provided. Two ilustrative examples are solved in detail.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[Logo]]></kwd>
<kwd lng="es"><![CDATA[flujos máximos]]></kwd>
<kwd lng="es"><![CDATA[algoritmos de etiquetado]]></kwd>
<kwd lng="es"><![CDATA[listas]]></kwd>
<kwd lng="es"><![CDATA[arreglos]]></kwd>
<kwd lng="en"><![CDATA[Logo]]></kwd>
<kwd lng="en"><![CDATA[maximum flows]]></kwd>
<kwd lng="en"><![CDATA[labelling algorithms]]></kwd>
<kwd lng="en"><![CDATA[lists]]></kwd>
<kwd lng="en"><![CDATA[arrays]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="justify"><font face="verdana" size="4">Educaci&oacute;n en ingenier&iacute;a</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="center"><font face="verdana" size="4"><b>Dise&ntilde;o de un programa en Logo para calcular flujos m&aacute;ximos en redes</b></font></p>     <p align="center"><font face="verdana" size="2">&nbsp;</font></p>     <p align="center"><font face="verdana" size="2"><b>M.A. Murray&#150;Lasso</b></font></p>     <p align="center"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><i>Unidad de Ense&ntilde;anza Auxiliada por Computadora Departamento de Ingenier&iacute;a de Sistemas, Divisi&oacute;n de Ingenier&iacute;a Mec&aacute;nica e Industrial Facultad de Ingenier&iacute;a, UNAM</i></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>E&#150;mail:    <br> </b><a href="mailto:mamurray@servidor.unam.mx">mamurray@servidor.unam.mx</a></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2">Recibido: agosto de 2004    <br>   Aceptado: diciembre de 2004</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Resumen</b></font></p>     <p align="justify"><font face="verdana" size="2">Se muestran los pormenores del dise&ntilde;o de un programa Logo para calcular flujos m&aacute;ximos entre pares de puntos sobre redes orientadas, cuyas ramas tienen un l&iacute;mite superior al flujo que puede circular por ellas. Para el dise&ntilde;o del programa se utilizan Listas, que es la &uacute;nica estructura de datos soportada por Logo, pero que es muy adecuada para representar y manipular redes que no est&aacute;n muy densamente conectadas, que es el caso m&aacute;s frecuente en redes de flujo. Dado que Logo no soporta arreglos, y &eacute;stos resultan convenientes en el programa, se muestra la manera de implementarlos utilizando la flexibilidad de Logo en el manejo de los nombres de las variables. Tambi&eacute;n se proporcionan listas de programas en Logo Writer que implementan los algoritmos de etiquetado de Ford y Fulkerson. Como apoyo a la docencia se incluyen rutinas que se pueden utilizar como instrumentos que le permiten al maestro y alumno seguir las variaciones de las estructuras durante el proceso. Finalmente, se resuelven en detalle dos ejemplos ilustrativos.</font></p>     <p align="justify"><font face="verdana" size="2"><b>Descriptores:</b> Logo, flujos m&aacute;ximos, algoritmos de etiquetado, listas, arreglos.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Abstract</b></font></p>     <p align="justify"><font face="verdana" size="2">The details of the design of a Logo program to calculate maximum flows between pairs of points in oriented networks with branches having upper limits to flow. For the design Lists, which are the only data strustures supported by Logo, buy which are quite appropriate to represent and handle networks not densely connected, the most common case in flow networks are utilised. Since Logo does not support arrays and they are convenient in the program, it is shown to implement them taking advantage of the flexibility of Logo in the handling of the names of variables. Listings of Logo Writer programs implementing the labelling algorithms of Ford and Fulkerson are provided. As teaching aids, routines that can be used as instruments to allow teachers and students to follow the variations in the structures during the process, are also provided. Two ilustrative examples are solved in detail.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Keywords:</b> Logo, maximum flows, labelling algorithms, lists, arrays.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Introducci&oacute;n</b></font></p>     <p align="justify"><font face="verdana" size="2">El lenguaje Logo es uno de los lenguajes educativos dise&ntilde;ados para la ense&ntilde;anza, incluyendo la ense&ntilde;anza de la programaci&oacute;n. Se ha popularizado entre los maestros de educaci&oacute;n b&aacute;sica y media por tener entradas f&aacute;ciles al lenguaje que permiten que se pueda estar programando desde la primera sesi&oacute;n. El lenguaje generalmente funciona como un int&eacute;rprete, no tiene instrucci&oacute;n GOTO, es altamente estructurado, favorece la creaci&oacute;n de procedimientos que se comunican entre s&iacute; y el uso de la recursi&oacute;n. El lenguaje fue creado entre la empresa Bolt, Beranek y Newman y el Grupo de Inteligencia Artificial del MIT (Instituto Tecnol&oacute;gico de Massachusetts) y es un derivado del LISP. Tiene suficientes diferencias comparado con lenguajes como BASIC, Pascal y C que orilla al programador a pensar con un estilo diferente. Su principal (y en muchas versiones, su &uacute;nica) estructura de datos es la Lista, a la cual se espera se le agreguen y eliminen los elementos exclusivamente en su principio y en su final. El lenguaje Logo ha adquirido la reputaci&oacute;n de ser un lenguaje de programaci&oacute;n para ni&ntilde;os; sin embargo, el poder&iacute;o del lenguaje es igual al de cualquier otro lenguaje de programaci&oacute;n; lo que pasa es que muchos libros se concentran en (y en algunos casos se limitan a) las instrucciones elementales para dibujar con la tortuga y casi no tratan las porciones "avanzadas" del lenguaje como el manejo no trivial de listas y la recursi&oacute;n no trivial. </font></p>     <p align="justify"><font face="verdana" size="2">En este art&iacute;culo se dise&ntilde;a un programa para el c&aacute;lculo del flujo m&aacute;ximo en una red, el cual requiere las porciones avanzadas del lenguaje. En el programa dise&ntilde;ado se implementan lo que equivale a vectores de listas y arreglos bidimensionales (no obstante que el lenguaje no los soporta), los cuales permiten el manejo eficiente de la memoria para redes poco densamente conectadas, que son la regla, m&aacute;s que la excepci&oacute;n en las aplicaciones. El prop&oacute;sito principal de este trabajo es mostrar las partes avanzadas del lenguaje Logo en un contexto de aplicaci&oacute;n a un caso espec&iacute;fico, en vez de hacerlo con el estilo de un manual, ilustrando con ejemplos muy cortos el uso de cada instrucci&oacute;n y estructura de datos.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Algoritmo de etiquetado de Ford y Fulkerson para el c&aacute;lculo del flujo m&aacute;ximo de una red</b></font></p>     <p align="justify"><font face="verdana" size="2">Entre los principales pioneros de la disciplina de flujos en redes est&aacute;n Ford y Fulkerson (1962), quienes dieron un algoritmo para calcular el flujo m&aacute;ximo que puede fluir entre un nodo origen y un nodo destino en una red orientada cuyas ramas tienen una capacidad m&aacute;xima de flujo. Una t&iacute;pica red es la que se muestra en <a href="#f1">la figura 1</a>, la cual utilizaremos como ejemplo durante el art&iacute;culo. En la red de la <a href="#f1">figura 1</a> se han numerado consecutivamente los nodos; las cantidades junto a las flechas denotan la capacidad m&aacute;xima de flujo en la direcci&oacute;n de la flecha de la rama correspondiente. El nodo 1 es el nodo origen al cual se le inyecta un flujo que sale por el nodo destino 6. El algoritmo de Ford y Fulkerson es un algoritmo de etiquetado.</font></p>     <p align="center"><a name="f1"></a></p>     <p align="center"><img src="/img/revistas/iit/v7n1/a04f1.jpg"></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Si llamamos a los nodos <i>i, j, k, ..., s , t , ...</i> (al nodo fuente de donde parte el flujo hacia el resto de la red le llamamos <i>s</i> y al nodo destino al que llega el flujo del resto de la red le llamamos <i>t</i>); al flujo en la rama <i>(i, j)</i>, le llamamos <i>x<sub>ij</sub></i>, y a la capacidad de la rama <i>(i, j)</i>, <i>u<sub>ij</sub></i>, entonces el algoritmo es como sigue (Ford y Fulkerson, 1962):</font></p>     <p align="justify"><font face="verdana" size="2">Durante la rutina A, cada nodo est&aacute; en uno de tres estados: no&#150;etiquetado, etiquetado y no&#150;rastreado, o etiquetado y rastreado. Al principio todos los nodos est&aacute;n en el estado no&#150;etiquetado.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><i>Rutina A (proceso de etiquetado)</i></font></p>     <p align="justify"><font face="verdana" size="2">Primero, la fuente s recibe la etiqueta (* + ,&epsilon; (s) = &infin;). (La fuente   <i>s</i> est&aacute; ahora etiquetada y no&#150;rastreada; todos los dem&aacute;s nodos est&aacute;n no&#150;etiquetados.) En el paso general seleccione cualquier nodo etiquetado y no&#150;rastreado <i>i</i>. Sup&oacute;ngase que su etiqueta es  <i>(z&plusmn;, &epsilon;(i))</i>. A  todos   los nodos <i>j</i> que est&aacute;n no&#150;etiquetados y tales que el flujo <i>x<sub>ij</sub></i> &lt; <i>u<sub>ij</sub></i> as&iacute;gnele la etiqueta <i>(i+, &epsilon;(j))</i>, donde</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04e1.jpg"> (1) </font></p>     <p align="justify"><font face="verdana" size="2">(Dichas nodos <i>j</i> ahora est&aacute;n etiquetados y no&#150;rastreados). A todos los nodos <i>j</i> que ahora est&aacute;n no&#150;etiquetados, y tales que <i>x<sub>ij</sub></i> &gt; 0 as&iacute;gneles la etiqueta <i>(i&#150;, &epsilon;(j))</i>, donde</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04e2.jpg"> (2) </font></p>     <p align="justify"><font face="verdana" size="2">(Los nodos <i>j</i> ahora est&aacute;n etiquetados y no&#150;rastreados;   <i>i</i> est&aacute; etiquetado y rastreado).</font></p>     <p align="justify"><font face="verdana" size="2">Rep&iacute;tase el paso general hasta que una de dos: el nodo destino   <i>t</i> est&eacute; etiquetado y no&#150;rastreado o hasta que no sea posible asignar m&aacute;s etiquetas estando el nodo destino   <i>t</i> no&#150;etiquetado. En el primer caso ejecute la rutina B, en el segundo caso termina el algoritmo.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><i>Rutina B (cambio de flujo)</i></font></p>     <p align="justify"><font face="verdana" size="2">El nodo destino <i>t</i> ha recibido la etiqueta <i> (j&plusmn;,&epsilon;(t))</i>. Si <i>t</i> est&aacute; etiquetado <i>(j+,&epsilon;(t))</i>, reemplace <i>x<sub>jt</sub></i> por <i>x<sub>jt</sub></i> + <i>&epsilon;(t)</i>; si <i>t</i> est&aacute; etiquetada <i>(j&#150;,&epsilon;(t))</i> reemplace <i>x<sub>tj</sub></i> por <i>x<sub>tj</sub></i> + <i>&epsilon;(t)</i>. En cualquier caso, en seguida hay que ponerle atenci&oacute;n al nodo <i>j</i>. En general, si <i>j</i> est&aacute; etiquetado <i>(i+,&epsilon;(i))</i> reemplace <i>x<sub>ij</sub></i> por <i>x<sub>ij</sub></i><i>+ &epsilon;(t)</i>; y si est&aacute; etiquetado <i>(x&#150;,&epsilon;(j))</i> reemplace <i>x<sub>ji</sub></i> por <i>x<sub>ji </sub></i> &#150; <i>&epsilon;(t)</i> y siga con el nodo <i>i</i>. Contin&uacute;e de la misma manera hasta que alcance el nodo <i>s</i>. Elimine las etiquetas y regrese a la Rutina A.</font></p>     <p align="justify"><font face="verdana" size="2">El proceso de etiquetado es una b&uacute;squeda sistem&aacute;tica de una vereda aumentante del flujo del origen <i>s</i> al destino <i>t</i>. Se lleva informaci&oacute;n en las etiquetas de modo que cuando se etiqueta al destino <i>t</i> (al evento se le llama perforaci&oacute;n), se pueden cambiar los flujos con facilidad. Si por otra parte, la Rutina A termina y el nodo destino <i>t</i> no ha sido etiquetado (no&#150;perforaci&oacute;n), el flujo es m&aacute;ximo y los arcos que van de los nodos etiquetados a los nodos no&#150;etiquetados son un corte m&iacute;nimo, cuyo valor es igual a la suma de las capacidades de las ramas que parten de un nodo etiquetado y llegan a un nodo no&#150;etiquetado.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Descripci&oacute;n de la red para uso interno de la computadora</b></font></p>     <p align="justify"><font face="verdana" size="2">Hay varias maneras de describir una red para uso interno en la computadora. Para redes densamente conectadas una descripci&oacute;n eficiente involucra la <i>matriz de incidencia</i> (Ahuja <i>et al.</i>, 1993). Dadas las caracter&iacute;sticas de Logo, se utilizar&aacute;n las listas de <i>predecesores y sucesores<a href="#unas">*</a> </i>de cada nodo. La ventaja de esta descripci&oacute;n es que solamente se utiliza la memoria requerida para las ramas existentes y no para todas las posibles, adem&aacute;s de que se adapta muy bien a la estructura de datos lista con la que cuenta el lenguaje Logo. En vez de explicar la descripci&oacute;n en abstracto, es m&aacute;s f&aacute;cil explicarla ejemplificando para la red de la <a href="#f1">figura 1</a>. La red de la misma figura queda completamente especificada si se da:</font></p>     <blockquote>       <p align="justify"><font face="verdana" size="2">1. El n&uacute;mero de nodos.</font></p>       <p align="justify"><font face="verdana" size="2">2. El n&uacute;mero de ramas.</font></p>       ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">3. El n&uacute;mero del nodo origen.</font></p>       <p align="justify"><font face="verdana" size="2">4. El n&uacute;mero del nodo destino.</font></p>       <p align="justify"><font face="verdana" size="2">5. Para cada rama de la red se da el nodo inicial, el nodo final y la capacidad m&aacute;xima de flujo de la rama. Estas cantidades se pueden meter a una lista y darse en el orden descrito.</font></p> </blockquote>     <p align="justify"><font face="verdana" size="2">As&iacute;, para la red de la <a href="#f1">figura 1</a> dicha lista es:</font></p>     <p align="justify"><font face="verdana" size="2">&#91; 6 9 1 6 1 3 3 1 2 7 2 3 1 2 4 6 3 5 8 4 3 3 4 6 2 5 4 2 5 6 8 &#93;</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Estructuras de datos para los sucesores y predecesores</b></font></p>     <p align="justify"><font face="verdana" size="2">Para aplicar el algoritmo de Ford y Fulkerson se necesita recorrer uno a uno los sucesores y predecesores de un nodo, como paso preliminar se armar&aacute;n listas de predecesores y sucesores para cada uno de los nodos. Para ello, se utilizar&aacute; un vector (arreglo unidimensional) con una componente por nodo, cuyas componentes son listas de sucesores o predecesores. El lenguaje Logo no maneja arreglos; la manera como se implementar&aacute;n los vectores es creando variables individuales con nombres que incluyan los &iacute;ndices. As&iacute; por ejemplo, llamamos suc1 a la primera componente, <i>suc2</i> a la segunda, ... , <i>suc6</i> a la sexta, si queremos manejar un vector <i>suc(i)</i>, <i>i</i> = 1, ... , 6. Cada una de estas componentes ser&aacute; una lista con los sucesores del nodo, cuyo &iacute;ndice es el n&uacute;mero al final del nombre. Esta estratagema, que ser&iacute;a impr&aacute;ctica manejarla en lenguajes como BASIC, Pascal o C, es pr&aacute;ctica en Logo porque se puede manipular el nombre de la variable <i>nombre</i> en la instrucci&oacute;n</font></p>     <p align="justify"><font face="verdana" size="2"><b>da</b> <i>nombre valor</i></font></p>     <p align="justify"><font face="verdana" size="2">En Logo <i>nombre</i> se puede construir por medio de otras instrucciones. Por ejemplo, en vez de <i>nombre </i>se puede escribir</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font face="verdana" size="2">(<b>palabra</b> "suc :indice)</font></p>     <p align="justify"><font face="verdana" size="2">y <i>palabra</i> se construye con las letras <u><i>suc</i></u> concatenadas con las cifras del valor (:) de <u><i>indice</i></u>. La estratagema que se describe es equivalente a que en los lenguajes BASIC, Pascal o C se tuvieran instrucciones de asignaci&oacute;n del siguiente tipo:</font></p>     <p align="center"><font face="verdana" size="2">"suc" +   &iacute;ndice   :=    <i>expresi&oacute;n</i></font></p>     <p align="justify"><font face="verdana" size="2">aqu&iacute; del lado izquierdo de la asignaci&oacute;n se est&aacute; construyendo el nombre de la variable por concatenaci&oacute;n. Esta instrucci&oacute;n no existe en los lenguajes mencionados, ya que en los tres se requiere que del lado izquierdo de una asignaci&oacute;n aparezca <u>literalmente</u> el nombre legal de una variable.</font></p>     <p align="justify"><font face="verdana" size="2">Esta posibilidad existente en Logo (y en LISP) permite el estratagema para manejar arreglos sin que el lenguaje los soporte por medio de nombres adecuadamente seleccionados de variables simples.</font></p>     <p align="justify"><font face="verdana" size="2">El siguiente procedimiento <b>suc</b> utiliza la estratagema indicada para construir el arreglo de sucesores de los nodos.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p1.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Antes de ejecutar <b>suc</b> (en el procedimiento <b>datos</b> que se muestra m&aacute;s abajo ) se le quitan a la lista <i>datos</i> (que se le pasa como par&aacute;metro al procedimiento <i>suc</i>), los cuatro primeros n&uacute;meros, de modo que en <i>datos</i> se tiene para cada rama un tr&iacute;o con el nodo inicial, el nodo final y la capacidad de flujo m&aacute;xima de la rama. La segunda l&iacute;nea de <b>suc</b> detiene el procedimiento (alto) cuando se vac&iacute;a   la  lista  <i>datos</i>,  con  lo  cual  se detiene  la recursi&oacute;n  de  la  &uacute;ltima  l&iacute;nea de <b>suc</b>, ya que el procedimiento se llama a s&iacute; mismo en la &uacute;ltima l&iacute;nea En la tercera l&iacute;nea de <b>suc</b> se le asigna (da) a la lista cuyo nombre (palabra) est&aacute; formado por la concatenaci&oacute;n de <u>suc</u> con el primer elemento (pr)   de la lista <i>datos</i>, lo que se forma al agregar al final (pul) el segundo elemento (pr mpr) de   <i>datos</i> al resultado (cosa) del objeto cuyo nombre (palabra) es "suc concatenada con el primer elemento de <i>datos</i>.</font></p>     <p align="justify"><font face="verdana" size="2">En las l&iacute;neas 4 y 5 de <b>suc</b> se aprovecha que ya se est&aacute; recorriendo la lista <i>datos</i> para formar e inicializar dos arreglos bidimensionales de flujos y capacidades de flujo m&aacute;ximo en las ramas. Se emplea la misma estratagema de ponerle a variables individuales nombres que incluyen los dos &iacute;ndices separados por una coma. A los flujos se le inicializa con ceros y a las capacidades se les ponen los valores tomados de la lista <i>datos</i>.</font></p>     <p align="justify"><font face="verdana" size="2">Todo lo que se especifica en el procedimiento <b>suc</b> se hace con los primeros tres elementos de la lista <i>datos</i>. Para hacer las operaciones con todos los dem&aacute;s se hace una llamada recursiva en la sexta l&iacute;nea cambiando el par&aacute;metro <i>datos</i> por la misma lista, a la cual se le eliminan sus primeros tres elementos. Esto se hace con la instrucci&oacute;n <i>mpr</i> que significa <i>menosprimero</i>, cuyo efecto sobre una lista es eliminar el primer elemento. Al aplicar la instrucci&oacute;n tres veces, el efecto es eliminar el primer tr&iacute;o de elementos.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">En forma similar a como se procedi&oacute; para formar el arreglo de sucesores, se forma un arreglo de predecesores con el procedimiento <b>pred</b>.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p2.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Procedimientos preliminares para introducir datos e inicializar arreglos</b></font></p>     <p align="justify"><font face="verdana" size="2">Antes de llamar a <b>suc</b> y <b>pred</b> se ejecuta el procedimiento <b>datos</b>, cuya funci&oacute;n es inicializar la lista <i>datos</i> que describe la red, luego tomar los primeros cuatro elementos de la lista original datos, asignarle los primeros cuatro valores a las variables globales <i>nn, nr, ni, nf</i> que representan el n&uacute;mero de nodos, n&uacute;mero de ramas, nodo inicial (origen) y nodo final (destino) respectivamente, y eliminar estos cuatro elementos de la lista para que en la lista <i>datos</i> (que es un objeto global) queden exclusivamente los tr&iacute;os de las ramas.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p3.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">A continuaci&oacute;n con <b>initetiq</b> se inicializan las etiquetas, todas con (0, 0), excepto el nodo origen que recibir&aacute; la etiqueta (* +, 9999). El n&uacute;mero 9999 es el n&uacute;mero m&aacute;s grande que utiliza LogoWriter y lo usamos en vez de infinito (&infin;).</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p4.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">N&oacute;tese como en <b>initetiq</b> el cambio de &iacute;ndices se logra con una llamada recursiva. El n&uacute;mero de nodos se le proporciona al procedimiento por medio del par&aacute;metro <i>n</i>. Para inicializar los "arreglos" de listas de predecesores y sucesores se ejecuta el procedimiento <b>initpredsuc</b>, en el cual todas las listas iniciales est&aacute;n vac&iacute;as.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p5.jpg"></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Como se indic&oacute; antes, los "arreglos" <i>f</i> y <i>u</i> para los flujos en las ramas y las capacidades de flujo m&aacute;ximas, se inicializan en el procedimiento <b>suc</b>.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Procedimientos principales para calcular el flujo m&aacute;ximo</b></font></p>     <p align="justify"><font face="verdana" size="2">Ahora se dise&ntilde;ar&aacute;n los procedimientos principales para implementar el algoritmo de Ford y Fulkerson para el c&aacute;lculo del flujo m&aacute;ximo. Se utilizan cuatro procedimientos: <b>flujo, etiqsuc, etiqpred, incflujo</b>. El primero hace la prueba para determinar si ya se ha alcanzado el flujo m&aacute;ximo, borra las etiquetas al final de cada perforaci&oacute;n y reinicializa un nuevo intento para encontrar una vereda que aumente el flujo y lleva el control de la lista de los nodos etiquetados y rastreados. Los dos siguientes procedimientos (<b>etiqsuc</b> y <b>etiqpred</b>) realizan el proceso de etiquetar a todos los sucesores y predecesores del nodo al que se le est&aacute; dando servicio en la lista de nodos etiquetados y no rastreados. El procedimiento <b>incflujo</b> hace las operaciones necesarias para incrementar el flujo en las ramas adecuadas cuando hay una perforaci&oacute;n.</font></p>     <p align="justify"><font face="verdana" size="2">Para llevar cuenta en la computadora de cu&aacute;les nodos est&aacute;n etiquetados y no rastreados y cu&aacute;les est&aacute;n etiquetados y rastreados, se utilizan dos listas: la que almacena para cada perforaci&oacute;n los nodos etiquetados y rastreados se llama <i>ee</i> y es un objeto global. La que almacena en cada perforaci&oacute;n los nodos etiquetados y no rastreados se llama <i>lista</i>, se le pasa como par&aacute;metro al procedimiento <b>flujo</b> y est&aacute; vigente en la ejecuci&oacute;n de los tres procedimientos <b>etiqsuc, etiqpred</b> e <b>incflujo</b>. A los elementos almacenados en <i>lista</i> se les va dando servicio para entonces, desde ellos etiquetar sucesores y predecesores. Para que un nodo se etiquete es necesario que no est&eacute; etiquetado, es decir, que no sea miembro ni de <i>ee</i> ni de <i>lista</i>. Una vez que desde un nodo se etiquetan sucesores y predecesores, al nodo se le elimina de lista y se le agrega a <i>ee</i>. Para eliminarlo se llama recursivamente a los procedimientos <b>etiqsuc</b> y <b>etiqpred</b> con el argumento <i>mpr lista</i> en vez de <i>lista</i>. Para agregar un nodo al final de una lista se utiliza la instrucci&oacute;n de Logo   <i>pul elemento lista</i>.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p6.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">En los procedimientos <b>etiqsuc</b> y <b>etiqpred</b> se utiliza la funci&oacute;n <b>min</b>, ya que el algoritmo de Ford y Fulkerson lo requiere. La funci&oacute;n <b>min</b> reporta (o regresa) el m&iacute;nimo de sus dos argumentos num&eacute;ricos. Como LogoWriter no cuenta con esta funci&oacute;n, &eacute;sta se ha implementado como sigue:</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p7.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">El procedimiento <b>etiqsuc</b> etiqueta a los sucesores del nodo al que se est&aacute; dando servicio en la <i>lista</i>; <b>etiqpred</b> hace lo correspondiente para los predecesores. Detecta cuando el nodo destino recibe una etiqueta y llama al procedimiento <b>incflujo</b> cuando esto sucede. Controla que al regreso de esta llamada se borren y reinicialicen la lista <i>ee</i>, asi como las etiquetas, y se llame de nuevo al procedimiento <b>flujo</b> para dar servicio al primer elemento en la <i>lista</i>. El procedimiento <b>incflujo</b> se encarga de incrementar (o decrementar cuando la primera parte de la etiqueta tiene signo menos) los flujos en todas las ramas que forman una vereda del origen al destino. Para encontrar la vereda en sentido contrario, comenzando con el destino, se va fijando en las primeras partes de los nodos, cada una de las cuales apuntan al nodo etiquetador.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Arranque del programa y generaci&oacute;n de resultados</b></font></p>     <p align="justify"><font face="verdana" size="2">En los procedimientos <b>ff</b> y <b>calc</b> se hacen las llamadas a los procedimientos que arrancan todo el proceso para calcular los flujos m&aacute;ximos. El procedimiento <b>ff</b> finalmente llama a los procedimientos <b>datos, initpredsuc, suc, pred</b> y <b>calc</b>. Todos, menos <b>calc</b>, han sido explicados anteriormente. El procedimiento  <b>calc</b> inicializa la lista <i>ee</i>, llama al procedimiento que inicializa los "arreglos" de etiquetas y para arrancar los c&aacute;lculos de flujo m&aacute;ximo, finalmente llama al procedimiento <b>flujo</b> para realizar los c&aacute;lculos. En la llamada a <b>flujo</b> utiliza como par&aacute;metro <i>lista</i>, la misma que cuenta con un solo elemento consistente en el nodo origen de la red,   <i>ni</i>. Cuando la llamada a <b>flujo</b> se detiene, se llama al procedimiento <b>resultados</b> , que imprime los flujos en las ramas que producen el flujo m&aacute;ximo, dando para cada rama de la red su nodo inicial, final y el valor del flujo en la rama, as&iacute; como el valor del flujo m&aacute;ximo entre el nodo origen, destino y los nodos que especifican el corte m&iacute;nimo. Para calcular los flujos m&aacute;ximos entre un par de nodos en una red, el usuario solamente debe, desde el editor de procedimientos de LogoWriter, colocar en el procedimiento <b>datos</b> la lista que de scribe la red y desde el centro de mandos teclear <b>ff</b> seguido de la tecla de retorno. A continuaci&oacute;n, se muestran los procedimientos <b>ff</b>, <b>calc</b> y <b>resultados</b>.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p8.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Ahora se muestra lo que producen los programas con la informaci&oacute;n del listado de <b>datos</b> que se anot&oacute; arriba, el cual corresponde a la red de la <a href="#f1">figura 1</a>. El resultado se logra tecleando en el centro de mandos <b>ff</b> seguido de la tecla de retorno.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p9.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Ejemplo adicional</b></font></p>     <p align="justify"><font face="verdana" size="2">Para probar el programa con una red un poco mayor, se resolver&aacute; un ejemplo tomado de (Jensen y Barnes, 1980). La red se muestra en la <a href="#f2">figura 2</a>. Junto a cada rama aparecen sus capacidades de flujo m&aacute;ximas. Si se toma como nodo origen el nodo 1 y como nodo destino el 13, notamos que la red tiene 13 nodos y 28 ramas. La representaci&oacute;n de la red en forma de lista es la siguiente:</font></p>     <p align="center"><font size="2" face="verdana"><a name="f2"></a></font></p>     <p align="center"><font size="2" face="verdana"><img src="/img/revistas/iit/v7n1/a04f2.jpg"></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04l1.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Esta lista se introduce en el procedimiento <b>datos</b> con la instrucci&oacute;n <b>da "datos <i>lista</i></b>,  ya sea en vez de la que actualmente aparece o a continuaci&oacute;n (pues en este &uacute;ltimo caso la asignaci&oacute;n simplemente sobreescribe en lista lo dejado por la anterior instrucci&oacute;n). Luego se teclea <b>ff</b> seguido de la tecla de retorno. Los resultados que se obtienen se muestran a continuaci&oacute;n.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p10.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Revisando los resultados constatamos:</font></p>     <blockquote>       <p align="justify"><font face="verdana" size="2">1) que se satisfacen los l&iacute;mites m&aacute;ximos sobre todos los flujos,</font></p>       <p align="justify"><font face="verdana" size="2">2)&nbsp; que se satisface la Ley de Conservaci&oacute;n de Flujos de Kirchhoff en cada uno de los nodos habiendo un exceso de flujo que sale del nodo origen igual al exceso de flujo que llega al nodo destino, ambos con valor igual a la capacidad o valor del corte m&iacute;nimo, el cual corresponde a las ramas que atraviesan la superficie gaussiana que encierra los nodos 1 y 4. La teor&iacute;a de flujos nos dice que basta que se satisfagan las restricciones m&aacute;ximas de flujo en todas las ramas, la ley de conservaci&oacute;n de flujo en todos los nodos y que el flujo entre origen y destino sea igual al valor de alg&uacute;n corte con respecto a origen y destino para que dicha distribuci&oacute;n de flujos corresponda a un flujo m&aacute;ximo entre origen y destino. De esta manera, se tiene la certeza de que la soluci&oacute;n producida por el programa es correcta.</font></p> </blockquote>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Instrumentaci&oacute;n adicional para el programa</b></font></p>     <p align="justify"><font face="verdana" size="2">El programa desarrollado en este art&iacute;culo tiene prop&oacute;sitos educativos, por ello, conviene agregarle instrumentos adicionales que sean &uacute;tiles en la de teor&iacute;a de flujos en redes, en general y de la ense&ntilde;anza del algoritmo de Ford y Fulkerson para el c&aacute;lculo de flujos m&aacute;ximos, en particular. Ante todo, conviene que el alumno pueda ver las estructuras de datos en lugares estrat&eacute;gicos del programa para comparar con lo que el alumno har&iacute;a manualmente. Algunas estructuras de datos no cambian durante todo el proceso, por lo que se pueden imprimir una vez. Este es el caso de las listas de predecesores y sucesores y las variables nn, nr, ni, nf con la cantidad de nodos, ramas, el nodo origen y el nodo destino, as&iacute; como las capacidades m&aacute;ximas de flujo de las ramas y sus nodos inicial y final.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Las cantidades que var&iacute;an durante el curso de la aplicaci&oacute;n del algoritmo son: las etiquetas de los nodos, los flujos en las ramas, el flujo total entre origen y destino.</font></p>     <p align="justify"><font face="verdana" size="2">Se utilizar&aacute;n los siguientes procedimientos auxiliares: <b>n, p, s, c, e, f, ee, li,</b> los cuales imprimen respectivamente las cantidades de nodos, ramas, nodo inicial y final; las listas de predecesores, las listas de sucesores, las capacidades de flujo m&aacute;ximo en las ramas, las etiquetas de los nodos, los flujos en las ramas obtenidos hasta el momento y el flujo total de origen a destino obtenido hasta el momento; el contenido de la lista <b>ee</b> de nodos etiquetados y rastreados hasta el momento; y el contenido de la lista <i>lista</i> con los nodos etiquetados y no rastreados hasta el momento.</font></p>     <p align="justify"><font face="verdana" size="2">Los listados de los procedimientos auxiliares son:</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p11.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">Se pueden  insertar  llamadas a  los  procedimientos en lugares estrat&eacute;gicos del programa para visualizar el proceso algor&iacute;tmico y la manera como cambian los resultados intermedios.</font></p>     <p align="justify"><font face="verdana" size="2">A continuaci&oacute;n se indica una posibilidad:</font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>n </b>: En el procedimiento <b>calc </b> inmediatamente antes de <b>flujo (lista :ni)</b></font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>p </b>: Inmediatamente despu&eacute;s de la llamada a <b>n</b>.</font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>s </b>: Inmediatamente despu&eacute;s de la llamada a <b>p</b>.</font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>c </b>: Inmediatamente despu&eacute;s de la llamada a <b>s</b>.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">Llamadas a <b>e </b>: En el procedimiento <b>etiqsuc </b> inmediatamente despu&eacute;s del "<b>&#91;</b>" en la l&iacute;nea que comienza <b><i>si (ul cosa </i></b>etc. En el procedimiento <b>etiqpred </b> inmediatamente despu&eacute;s del "<b>&#91;</b>" en la l&iacute;nea que comienza <b><i>si (ul cosa </i></b>etc.</font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>f </b>: En el procedimiento <b>incflujo </b> inmediatamente despu&eacute;s del "<b>&#91;</b>" en la segunda l&iacute;nea que comienza <b>si :nn = </b>etc.</font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>ee </b>: En el procedimiento <b>flujo </b> inmediatamente antes de la pen&uacute;ltima l&iacute;nea que dice <b>flujo mpr :lista.</b></font></p>     <p align="justify"><font face="verdana" size="2">Llamadas a <b>li </b>: En el procedimiento <b>flujo </b> inmediatamente antes de la l&iacute;nea que comienza <b>etiqsuc cosa </b>etc. </font></p>     <p align="justify"><font face="verdana" size="2">A continuaci&oacute;n, se muestra un segmento corto de una parte intermedia de la salida producida por el programa cuando est&aacute; instrumentado con los procedimientos listados arriba y con las llamadas colocadas en los lugares indicados. Los datos corresponden al la red de la <a href="#f2">figura 2</a>.</font></p>     <p align="justify"><font face="verdana" size="2"><img src="/img/revistas/iit/v7n1/a04p12.jpg"></font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Conclusiones</b></font></p>     <p align="justify"><font face="verdana" size="2">Se ha presentado el dise&ntilde;o y realizaci&oacute;n de un programa en el lenguaje Logo para el c&aacute;lculo de flujo m&aacute;ximo en una red orientada con capacidades de flujo m&aacute;ximo en las ramas. El programa se basa en el algoritmo de Ford y Fulkerson. La estrategia encuentra veredas aumentantes de flujo en orden de n&uacute;mero de ramas, por lo que se puede garantizar la eficiencia c&uacute;bica del algoritmo, a diferencia del algoritmo original de Ford y Fulkerson que podr&iacute;a tardarse un tiempo exponencial (Ahuja <i>et al </i>., 1993) Se desarroll&oacute; el programa en Logo con el prop&oacute;sito de ilustrar el poder&iacute;o de dicho lenguaje en aplicaciones en las que normalmente se utilizan lenguajes como FORTRAN, Pascal, C o BASIC, los cuales soportan arreglos uni y multidimensionales, y algunos de ellos (Pascal y C), listas ligadas y apuntadores. Logo no soporta arreglos; sin embargo, se puede implantar el equivalente a los mismos por medio de distintas variables para cada componente incorporando os &iacute;ndices en el nombre de la variable. En el art&iacute;culo se muestra la manera de hacerlo. De esta forma, se puede ahorrar memoria e incluir solamente las variables que aparecen en la red, las cuales en aplicaciones reales son un porcentaje muy bajo de las posibles. Por otra parte, los componentes de los "arreglos" que se manejan en el art&iacute;culo frecuentemente son listas de longitud variable durante el curso del programa, y las listas si son estructuras de datos que maneja bien el lenguaje Logo. En este art&iacute;culo se proporciona un listado completo del programa en LogoWriter con una discusi&oacute;n detallada de su implantaci&oacute;n y dos redes resueltas en todo detalle. Aqu&iacute; no se pretende ense&ntilde;ar LogoWriter. El lector que requiera ayuda con las instrucciones puede consultar Logo Computer Systems Inc., 1990. Para hacer m&aacute;s &uacute;til el programa en la educaci&oacute;n, tambi&eacute;n se proporciona un juego de instrumentos educativos (procedimientos) para que el maestro y estudiante puedan observar el curso del algoritmo, como van cambiando las estructuras de datos para poder comparar con lo que se obtendr&iacute;a al aplicar manualmente el algoritmo de Ford y Fulkerson.</font></p>     <p align="justify"><font face="verdana" size="2">El autor espera que despu&eacute;s de leer este art&iacute;culo el lector quede convencido que el lenguaje Logo no es s&oacute;lo un lenguaje para ni&ntilde;os, sino un lenguaje completo que tiene algunas entradas simples, desde las cuales lo pueden abordar los ni&ntilde;os pero que les puede servir para crecer intelectualmente y utilizarlo el resto de su vida en aplicaciones tan complejas como aquellas en las que utiliza otros lenguajes de computadora. </font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Referencias</b></font></p>     <!-- ref --><p align="justify"><font face="verdana" size="2">Ahuja R.K., Magnanti T.L. y Orlin J.B. (1993). <i>Network Flows: Theory, Algorithms, and Applications</i>. Prentice&#150;Hall, Upper Saddle River, NJ.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4233144&pid=S1405-7743200600010000400001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Ford Jr. L.R. y Fulkerson D.R. (1962). <i>Flows in Networks</i>. Princeton University Press, Princeton, NJ.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4233145&pid=S1405-7743200600010000400002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Jensen P.A. y Barnes J.W. (1980). <i>Network Flow Programming. </i> John Wiley &amp; Sons, Inc., New York, pp. 165.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4233146&pid=S1405-7743200600010000400003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font face="verdana" size="2">Logo Computer Systems, Inc. (1990). <i>LogoWriter: Gu&iacute;a de Referencia. </i> Macrobit Editores, M&eacute;xico.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=4233147&pid=S1405-7743200600010000400004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Bibliograf&iacute;a sugerida</b></font></p>     <p align="justify"><font face="verdana" size="2">Cristofides N. (1975). <i>Graph Theory an Algorithmic Approach. </i> Academic Press, Inc., Londres.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="verdana" size="2"><b>Semblanza del autor</b></font></p>     <p align="justify"><font face="verdana" size="2"><i>Marco Antonio Murray&#150;Lasso.</i> Realiz&oacute; la licenciatura en ingenier&iacute;a mec&aacute;nica&#150;el&eacute;ctrica en la Facultad de Ingenier&iacute;a de la UNAM. El Instituto de Tecnolog&iacute;a de Massachussetts (MIT) le otorg&oacute; los grados de maestro en ciencias en ingenier&iacute;a el&eacute;ctrica y doctor en ciencias cibern&eacute;ticas. En M&eacute;xico, ha laborado como investigador en el Instituto de Ingenier&iacute;a y como profesor en la Facultad de Ingenier&iacute;a (UNAM) durante 44 a&ntilde;os; en el extranjero, ha sido asesor de la NASA en dise&ntilde;o de circuitos por computadora para aplicaciones espaciales, investigador en los Laboratorios Bell, as&iacute; como profesor de la Universidad Case Western Reserve y Newark College of Engineering, en los Estados Unidos. Fue el presidente fundador de la Academia Nacional de Ingenier&iacute;a de M&eacute;xico; vicepresidente y presidente del Consejo de Academias de Ingenier&iacute;a y Ciencias Tecnol&oacute;gicas (organizaci&oacute;n mundial con sede en Washington que agrupa las Academias Nacionales de Ingenier&iacute;a) y secretario de la Academia Mexicana de Ciencias. Actualmente es jefe de la Unidad de Ense&ntilde;anza Auxiliada por Computadora de la Secretar&iacute;a de Estudios de Posgrado de la Facultad de Ingenier&iacute;a de la UNAM, investigador nacional, consejero educativo del MIT y consultor de la UNESCO, as&iacute; como Presidente Fundador del Consejo de Honor de la Academia Mexicana de Ciencias, Artes, Tecnolog&iacute;a y Humanidades.</font></p>     <p align="justify"><font face="verdana" size="2">&nbsp;</font></p>     <p align="justify"><font face="verdana" size="2"><b>Nota</b></font></p>     <p align="justify"><font face="verdana" size="2">*<a name="unas"></a> Son <i>sucesores</i> de un nodo <i>i</i> los nodos <i>j</i> a los que se puede llegar partiendo de <i>i</i>, viajando por una sola rama en el sentido de su flecha. Son <i>predecesores</i> de un nodo <i>i</i> los nodos <i>j</i> a los que se puede llegar partiendo de <i>i</i> viajando por una sola rama en el sentido contrario a su flecha.</font></p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ahuja]]></surname>
<given-names><![CDATA[R.K.]]></given-names>
</name>
<name>
<surname><![CDATA[Magnanti]]></surname>
<given-names><![CDATA[T.L.]]></given-names>
</name>
<name>
<surname><![CDATA[Orlin]]></surname>
<given-names><![CDATA[J.B.]]></given-names>
</name>
</person-group>
<source><![CDATA[Network Flows: Theory, Algorithms, and Applications]]></source>
<year>1993</year>
<publisher-loc><![CDATA[Upper Saddle River^eNJ NJ]]></publisher-loc>
<publisher-name><![CDATA[Prentice-Hall]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ford Jr.]]></surname>
<given-names><![CDATA[L.R.]]></given-names>
</name>
<name>
<surname><![CDATA[Fulkerson]]></surname>
<given-names><![CDATA[D.R.]]></given-names>
</name>
</person-group>
<source><![CDATA[Flows in Networks]]></source>
<year>1962</year>
<publisher-loc><![CDATA[Princeton^eNJ NJ]]></publisher-loc>
<publisher-name><![CDATA[Princeton University Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Jensen]]></surname>
<given-names><![CDATA[P.A.]]></given-names>
</name>
<name>
<surname><![CDATA[Barnes]]></surname>
<given-names><![CDATA[J.W.]]></given-names>
</name>
</person-group>
<source><![CDATA[Network Flow Programming]]></source>
<year>1980</year>
<page-range>165</page-range><publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[John Wiley & Sons, Inc.]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="book">
<collab>Logo Computer Systems, Inc.</collab>
<source><![CDATA[LogoWriter: Guía de Referencia]]></source>
<year>1990</year>
<publisher-name><![CDATA[Macrobit Editores]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
