You are on page 1of 52

Programa desarrollado

Unidad 3. Redes

Universidad Abierta y a Distancia de México

Licenciatura en Matemáticas Computación I

6° Cuatrimestre

Unidad 3. Redes

Clave: 050920621/060920621

Educación Abierta y a Distancia * Ciencias Exactas, Ingenierías y Tecnologías 1

1

Programa desarrollado
Unidad 3. Redes

Índice
Presentación de la unidad .......................................................................................................................... 3 Propósitos ................................................................................................................................................... 3 3.1. Fundamentos ........................................................................................................................................ 3 3.1.1. Conceptos Básicos .......................................................................................................................... 4 3.1.2. Características ................................................................................................................................. 9 Actividad 1. Fundamentos de redes......................................................................................................... 17 3.2. Flujo..................................................................................................................................................... 18 3.2.1. Flujo Máximo.................................................................................................................................. 19 3.2.2. Teorema del Corte Mínimo y Flujo Máximo .................................................................................... 22 3.2.3. Algoritmo de Corte Mínimo y Flujo Máximo .................................................................................... 24 Actividad 2. Teoremas y algoritmos de flujo ........................................................................................... 28 3.3. Conexidad ........................................................................................................................................... 29 3.3.1. Conexidad Puntual ......................................................................................................................... 31 3.3.2. Conexidad Lineal ........................................................................................................................... 33 3.3.3. Teorema de Menger....................................................................................................................... 34 3.4. Programación ..................................................................................................................................... 36 3.4.1. Solución de Problemas de Redes .................................................................................................. 37 Actividad 3. Análisis de conexidad .......................................................................................................... 49 Autoevaluación.......................................................................................................................................... 50 Evidencia de Aprendizaje. Programación de algoritmos para resolver problemas de redes .............. 51 Cierre de la Unidad .................................................................................................................................... 51 Para saber más .......................................................................................................................................... 51 Fuentes de consulta .................................................................................................................................. 52

Educación Abierta y a Distancia * Ciencias Exactas, Ingenierías y Tecnologías 2

2

Programa desarrollado
Unidad 3. Redes
Presentación de la unidad
Las redes aparecen en casi cualquier área del quehacer humano, desde los circuitos eléctricos hasta las redes sociales, y requieren soluciones para sus problemas. En esta unidad tendrás la oportunidad de aprender los fundamentos de las redes para que seas capaz de analizarlas y proponer soluciones a sus problemas de flujo. La Teoría de gráficas aporta una plataforma para representar las redes en el ámbito matemático. Aprenderás conceptos, teoremas y algoritmos para computadora alrededor de esta teoría que te ayudarán a resolver problemas de las representaciones de las redes. También estudiarás conceptos, métodos y algoritmos que te permitirán analizar la conexidad de las gráficas. Finalmente conocerás el código ejecutable en una computadora de algoritmos relacionados con gráficas y flujo en redes.

Propósitos
Al finalizar esta unidad serás capaz de:     Identificar los fundamentos de las redes. Identificar teoremas y algoritmos de flujo en las redes. Analizar la conexidad de gráficas. Programar algoritmos para resolver problemas de redes.

Competencia específica
Utilizar algoritmos sobre gráficas dirigidas para determinar flujos y rutas mediante herramientas informáticas.

3.1. Fundamentos
Los procesos y algoritmos que discutiremos en esta unidad son, de muchas maneras, el producto directo de la necesidad de resolver esta clase específica de problemas. “En el libro (Network Flows: Theory, Algorithms, and Applications.) de Ahuja, Ravindra K., Thomas L. Magnanti, and James B. Orlin. (1993). Contiene una discussion extensa de de numerosas aplicaciones de los algoritmos de flujo en redes: Entre las aplicaciones que se discuten en el libro se encuentran las siguientes:  Dado un conjunto de tareas a ser realizado por un conjunto de empleados, encontrar una tarea que minimiza el gasto global cuando diferentes empleados cuestan diferentes cantidades dependiendo de la tarea a la que fueron asignados.

Educación Abierta y a Distancia * Ciencias Exactas, Ingenierías y Tecnologías 3

3

Programa desarrollado
Unidad 3. Redes
 Dado un conjunto de solicitantes que han sido entrevistados para un conjunto de puestos disponibles, encontrar un esquema que maximiza el número de solicitantes seleccionados para los trabajos para los cuales están calificados. Determinar la forma más efectiva en costo para embarcar bienes desde un conjunto de fábricas proveedoras hacia un conjunto de tiendas minoristas que venden esos bienes. Determinar la forma más efectiva en costo para embarcar bienes desde un conjunto de fábricas proveedoras hacia un conjunto de tiendas minoristas que venden esos bienes, considerando el uso potencial de un conjunto de almacenes como estaciones intermedias. Dada una red que muestra la capacidad potencial para que bienes puedan ser embarcados entre dos localidades, calcular el flujo máximo soportado por la red.”

Como un ejemplo más, podemos estar examinando un mapa de rutas de una línea aérea y formulando preguntas como ¿Cuál es la forma más rápida de llegar de esta ciudad a esta otra? O quizás estamos interesados en la manera más barata de llegar, no en el tiempo. Para responder a estas preguntas necesitamos información acerca de las interconexiones entre los objetos. Los circuitos eléctricos son otro ejemplo de la importancia de las conexiones entre objetos. Los dispositivos eléctricos pueden ser representados y procesados dentro de una computadora para responder preguntas simples como “¿Ya todo está conectado? O preguntas más complejas como ¿Funcionará este circuito si se construye? La estructura o patrón de interconexión de una red puede ser representada por una gráfica. Las propiedades de la gráfica de una red se relacionan a menudo con las características específicas de esa red; por ejemplo, siendo el ruteo una funcionalidad esencial en muchas redes, la complejidad computacional del ruteo de la trayectoria más corta depende de la cuenta de saltos en la gráfica subyacente. La Teoría de Gráficas es una rama de las matemáticas iniciada por Euler en 1736 y ha encontrado muchas aplicaciones en la ingeniería y en la ciencia para resolver problemas de redes.

3.1.1. Conceptos básicos
En Matemáticas discretas tuviste la oportunidad de trabajar con la teoría de gráficas, así que sólo revisaremos a continuación algunos conceptos que seguramente ya conoces y que conectaremos con representaciones en computadora; utilizaremos más adelante esas representaciones para desarrollar algoritmos capaces de resolver problemas de redes. Una gráfica consiste de un conjunto de objetos llamados vértices, con ciertos pares de estos objetos conectados por enlaces llamados aristas (edges, en inglés). Por ejemplo, la gráfica de la figura siguiente contiene cuatro vértices (A, B, C, D), con B conectado a cada uno de los otros tres vértices, y C y D conectados también. Decimos que dos vértices son vecinos si están conectados por una arista.

Educación Abierta y a Distancia * Ciencias Exactas, Ingenierías y Tecnologías 4

4

Programa desarrollado
Unidad 3. Redes
Nota. La expresión “vértice” es propia de la Teoría de Gráficas; en la Teoría de Redes se utiliza el término “nodo”. Como estaremos utilizando gráficas y programando algoritmos alrededor de ellas para resolver problemas de redes, mantendremos el uso de "vértice" para evitar confusiones.

En la figura anterior se considera que la relación entre los dos extremos de una arista es simétrica; la arista simplemente los conecta. En otras situaciones, sin embargo, queremos expresar relaciones asimétricas – por ejemplo, que A apunta a B pero no viceversa. Para esto, definimos una gráfica dirigida como un conjunto de vértices y aristas dirigidas; cada arista dirigida es un enlace de un vértice al otro en el que la dirección es importante. Las gráficas dirigidas se trazan generalmente como muestra la figura siguiente, con las aristas representadas por flechas.

Cuando queramos enfatizar que una gráfica no es dirigida, la podemos llamar precisamente gráfica nodirigida; pero en general las gráficas que discutamos serán no-dirigidas a menos que se especifique otra cosa. Las Gráficas como Modelos de Redes Las gráficas son útiles porque sirven como modelos matemáticos de las estructuras de red. Por ejemplo, la figura siguiente muestra la primera estructura de internet –llamada entonces Arpanet en diciembre de 1970, cuando solamente tenía 13 sitios (trazamos las localidades sólo de forma aproximada). Si estás interesado, puedes encontrar diagramas acerca de este proyecto en (http://som.csudh.edu/cis/lpress/history/arpaMaps/).

Educación Abierta y a Distancia * Ciencias Exactas, Ingenierías y Tecnologías 5

5

lo que importa es cuáles vértices están conectados a cuáles otros. y las aristas representan los enlaces a través de los cuales los mensajes son transmitidos. y las redes de información. en la cual los vértices son computadoras u otros dispositivos que pueden trasmitir mensajes. y las aristas Educación Abierta y a Distancia * Ciencias Exactas. El diagrama puede reducirse a una gráfica de 13 vértices similar a las gráficas simples de las figuras anteriores. Notarás que el patrón de conexiones no depende de la posición de los vértices. Existen otros tipos de redes como las redes sociales. Obtenemos la gráfica siguiente: Las gráficas aparecen en muchos dominios. siempre que es útil representar cómo las cosas están física o lógicamente enlazadas unas con otras en una estructura de red. Ingenierías y Tecnologías 6 6 . Redes Los vértices representan computadoras y aparece una arista uniendo dos vértices si existe un enlace de comunicación entre ellos. en las cuales los vértices son recursos de información tales como páginas web o documentos. El caso de los 13 vértices de Arpanet es un ejemplo de una red de comunicaciones.Programa desarrollado Unidad 3. en las cuales los vértices son personas o grupos de personas y las aristas representan alguna clase de interacción social.

citas o referencias cruzadas.Programa desarrollado Unidad 3. y seguramente habrás notado que surgen naturalmente algunos temas con el uso de gráficas en estas áreas. te presentamos a continuación dos imágenes que se encuentran a menudo y que contienen gráficas. moviéndose de vértice a vértice en secuencia podría ser un pasajero siguiendo una secuencia de vuelos de una aerolínea. Trayectorias Hemos estado exponiendo algunos ejemplos de gráficas en diferentes áreas. Ingenierías y Tecnologías 7 7 . La lista de áreas en las que las gráficas tienen una presencia es muy larga. Redes representan conexiones lógicas tales como hipervínculos. Esta idea motiva la definición de camino en una gráfica: un camino es simplemente una secuencia de vértices con la propiedad de que cada par consecutivo en la secuencia está conectado por una arista. Educación Abierta y a Distancia * Ciencias Exactas. una pieza de información siendo pasada de persona a persona en una red social. Algunas veces también es útil pensar que el camino contiene no sólo los vértices sino también la secuencia de aristas que conectan esos vértices. o un usuario de computadora o pieza de software visitando una secuencia de páginas web a través de hipervínculos. Uno de los más notorios es la idea de que las cosas viajan a través de las aristas de una gráfica. de México) b) Rutas aéreas de Aeroméxico Trayectorias y Conectividad Repasemos ahora algunos de los conceptos y definiciones fundamentales que rodean a las gráficas. a) Red del Metro (Cd.

Por otro lado. y finalmente a ti de nuevo. La siguiente figura muestra un ejemplo de una gráfica disconexa: Educación Abierta y a Distancia * Ciencias Exactas. podemos decir que una gráfica es conexa cuando todos sus vértices están conectados. STAN. SRI. como lo es también la secuencia CASE. el resto de los vértices son distintos. Ciclos Un tipo particularmente importante de camino es un ciclo. un ciclo es un camino con al menos tres aristas. CASE. es natural preguntar si cada vértice puede alcanzar a todos los demás vértices a través de una trayectoria. Pero la mayoría de caminos que consideraremos no hacen esto. a su compañero de trabajo (tu hermano). BBN. Más precisamente. por ejemplo: SRI. MIT. UCLA. Redes En el ejemplo anterior de Arpanet. STAN. STAN. UTAH. UTAH. por ejemplo. Cuando descubres. un camino puede repetir vértices. Ingenierías y Tecnologías 8 8 . De forma más general. RAND. De forma general. BBN. CARN. En la gráfica de Arpanet se pueden encontrar muchos ciclos: SRI. no existe una razón a priori para esperar que las gráficas en otros casos estén conectadas – por ejemplo. a tu esposa. MIT. los ciclos en las redes de comunicaciones y transporte están presentes a menudo para permitir la redundancia –para proporcionar rutas alternativas. SRI. es razonable esperar que existan dos personas para los cuales no es posible construir una trayectoria entre ellas. cada arista en la red de Arpanet de 1970 pertenece a un ciclo. en la cual el primer vértice y el último son el mismo. BBN. Por ejemplo. RAND.Programa desarrollado Unidad 3. se espera que la mayoría de redes de comunicaciones y de transporte estén conectadas dado que su meta es mover tráfico de un vértice a otro. SRI o SRI. a su amigo de la secundaria. si queremos enfatizar que el camino que estamos discutiendo no repite vértices podemos referirnos a él como una trayectoria. LINCOLN. LINC. UCLA. UCLA. De hecho. la secuencia de vértices MIT. HARV. UTAH. MIT. la gráfica de Arpanet es conexa. UCLA es un camino. estás hablando de un ciclo que te contiene a ti. que el amigo de la secundaria del primo de tu esposa es alguien que trabaja con tu hermano. En esta definición. MIT. Dos vértices están conectados si existe un camino que los une. a su primo. UCSB. y esto fue hecho por diseño: significa que si alguna arista falla todavía habría una forma de llegar de un vértice a cualquier otro. De acuerdo a esto. SRI. Conectividad o Conexidad Dado una gráfica. en una red social. También en las redes sociales de amistad notamos a menudo ciclos en la vida diaria. el cual informalmente es una estructura de “anillo” como la de la secuencia de vértices LINC.

Por ejemplo.1. se divide naturalmente en un conjunto de “piezas” conexas. El subconjunto no es parte de un conjunto más grande con la propiedad de que cada vértice puede llegar a cualquier otro. Cada vértice en el subconjunto tiene una trayectoria hacia cada uno de los otros b. y (b) indica que realmente es una “pieza” independiente de la gráfica. grupos de vértices que están conectados cuando se les considera como gráficas aisladas. 3. el conjunto pertenece a un conjunto más grande (vértices F a M). Redes Componentes La figura anterior hace visualmente aparente un hecho básico acerca de las gráficas disconexas: si una gráfica es disconexa. Ingenierías y Tecnologías 9 . no una parte conexa de una pieza más grande. decimos que una componente conexa de una gráfica (a menudo llamada simplemente “componente”) es una subgráfica conexa maximal tal que: a. Con el fin de precisar esta noción. Nota que tanto (a) como (b) son necesarios para formalizar la definición intuitiva: (a) indica que el componente está conectado internamente. Características  Una gráfica está formada por dos conjuntos. G. H y J de la figura anterior no lo podemos considerar como un componente. otra que contiene los vértices C. de modo que no se traslapan. puede existir una estructura interna más rica que sea importante para la interpretación de la red. En la misma figura anterior. V el conjunto de vértices que debe ser a lo más numerable (y en este caso podemos pedir que sea finito). puedes ver que la gráfica consiste de tres de tales piezas: una que contiene los vértices A y B.Programa desarrollado Unidad 3. y A el conjunto de aristas que está 9 Educación Abierta y a Distancia * Ciencias Exactas. y E. y otra más que contiene el resto de los vértices. en el cual también existen trayectorias para todos los pares. El dividir una gráfica en sus componentes es solamente una primera forma de describir su estructura. porque viola la parte (b) de la definición: aunque existen trayectorias entre todos los pares de vértices. al conjunto de vértices F. D.2. Dentro de un componente dado.

La gráfica se define independientemente de la representación. Ingenierías y Tecnologías 10 10 . . debe tener un ciclo. Una gráfica es conexa si existe una trayectoria desde cada uno de los vértices hacia todos los otros vértices. Por ejemplo. por ejemplo la gráfica de la figura anterior tiene tres componentes conexos. las aristas AB AC AF FD DE EG forman un árbol generador para el componente grande de la gráfica anterior. es una lista de vértices en la cual vértices sucesivos se conectan a través de aristas. Un ciclo es una trayectoria que es simple excepto que el primero y el último vértice son el mismo. Una gráfica conexa sin ciclos se denomina árbol. Si se agrega una arista a un árbol. la trayectoria AFEGA es un ciclo. las dos figuras siguientes representan la misma gráfica. Un grupo de árboles disconexos entre sí se denomina bosque. Una gráfica disconexa está formado de componentes conexos.Programa desarrollado Unidad 3. Por ejemplo BAFEG es una trayectoria de B a G en la gráfica anterior. a puede variar desde 0 hasta letra p para referirse a la cardinalidad del conjunto V. Si una gráfica con v vértices tiene menos de v-1 aristas. Un árbol generador (spanning tree) es una subgráfica generadora a toda subgráfica que contiene a todos los vértices.           Estamos utilizando v para denotar el número de vértices en una gráfica y utilizaremos a para denotar el número de aristas (“edges” en inglés). Por ejemplo. También se suele utilizar la Educación Abierta y a Distancia * Ciencias Exactas. no es conexa. BAFEGAC no es una trayectoria simple. Un árbol con v vértices tiene exactamente v-1 aristas. se forma un único ciclo. Redes formado por parejas de elementos de V. Por ejemplo. Por ejemplo. Si tiene más de v-1 aristas.  Un camino del vértice “x” al “y” en una gráfica. Una trayectoria es un camino en el cual ningún vértice está repetido.

Redes   Las gráficas con relativamente pocas aristas son llamadas escasas. distancias o costos. Se puede utilizar cualquier esquema estándar de búsqueda. Las gráficas que hemos mostrado hasta el momento son llamados gráficas no-dirigidas. a través de un indexado de arreglos. ¿Recuerdas que estudiamos estas clases de algoritmos en la unidad anterior? Asumimos entonces que una función indice está disponible para convertir nombres de vértice a enteros entre 1 y v. Existen otros tipos de gráficas más complejos que tienen más información asociada con los vértices y las aristas:    En las gráficas ponderadas. Educación Abierta y a Distancia * Ciencias Exactas. utilizamos aquí nombres de vértice de una letra. La información extra que contienen las gráficas ponderadas y las dirigidas las hace obviamente un poco más difíciles de manipular que las gráficas simples no-dirigidas. Las gráficas ponderadas dirigidas son llamadas a veces redes. Aunque nombre e indice son simples en nuestros ejemplos. podemos trasladar los nombres de los vértices a enteros entre 1 y v manteniendo una tabla hash o un árbol binario que puede ser examinado para encontrar el entero correspondiente a un determinado nombre de vértice. La representación más directa de las gráficas es la llamada matriz de adyacencia: se mantiene un arreglo v por v de valores booleanos. por ejemplo. su uso facilita la extensión de los algoritmos para manipular gráficas con nombres reales de vértice por medio de las técnicas de búsqueda que aprendiste. Las gráficas con una falta relativamente baja de las aristas posibles son llamadas densas. El primer paso para representar una gráfica es mapear los nombres de los vértices a números enteros entre 1 y v. La razón principal del mapeo es hacer posible el acceso rápido a la información correspondiente a cada vértice. y una función nombre para convertir enteros a nombres de vértice. Para hacer los algoritmos fáciles de seguir. con a[x][y] establecido en 1 si existe una arista del vértice x al vértice y. es necesario decidir cómo representarlos dentro de la computadora. las aristas son de “un solo sentido”: una arista puede ir de x a y pero no de y a x. como es lo usual. la selección de cuál usar depende principalmente de si la gráfica es densa o escasa aunque. Ingenierías y Tecnologías 11 11 . Representaciones en Computadora Para poder procesar gráficas con un programa de computadora. Discutiremos dos de las representaciones más comunes. con la i-ésima letra del alfabeto correspondiendo al entero i. el tipo más simple de gráfica. En las gráficas dirigidas. y establecido en 0 en otro caso. la naturaleza de las operaciones a efectuar juega un papel importante. por ejemplo.Programa desarrollado Unidad 3. se asignan cantidades (pesos o valores) a cada arista para representar.

Asimismo. es usualmente conveniente asumir que existe una “arista” en cada vértice con sí mismo. y luego pares de nombres de vértices (lo cual define las aristas). dado que cualquier ordenamiento de las aristas representa la misma gráfica y resulta en la misma matriz de adyacencia. Por simplicidad. Usaremos entonces un formato más directo: primero leemos los nombres de los vértices. en la última sección de la unidad encontrarás programas completamente funcionales). pero esto resulta inapropiado para gráficas escasas. Una posibilidad es usar la matriz de adyacencia como el formato de entrada. Redes La matriz de adyacencia para la gráfica que hemos estado usando se muestra a continuación. y entonces el programa podría determinar v y a de la entrada.Programa desarrollado Unidad 3. Ingenierías y Tecnologías 12 12 . Como alternativa. necesitamos convenir en un formato de entrada. como la matriz de adyacencia. la entrada podría ser organizada con un delimitador que separe los vértices de las aristas. luego los vértices y las aristas. Educación Abierta y a Distancia * Ciencias Exactas. Una manera sencilla de proceder es leer los nombres de los vértices y guardarlos en una tabla hash o en un árbol de búsqueda binaria y asignar a cada nombre de vértice un entero que se usará para acceder a los arreglos de vértices indexados. int V. Puede ahorrarse espacio almacenando solamente la mitad de esta matriz simétrica. así a[x][x] está establecido en 1 para x desde 1 a v. El orden en el que aparecen las aristas no es importante. se puede utilizar el siguiente programa (en estas secciones detallaremos sólo las partes más relevantes de los programas y usaremos algo de pseudocódigo para facilitar las explicaciones. Introduciendo una Gráfica a la Computadora Para introducir una gráfica a la computadora. primero leemos v y a. Para construir en la computadora la matriz de adyacencia. A la lectura del i-ésimo vértice se le puede asignar el entero i. pero los algoritmos resultan un poco más simples cuando se utiliza la matriz completa. A A B C D E F G H I J K L M B C D E F G H I J K L M 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 Notarás que cada arista está representada en realidad por dos bits: una arista que conecta x y y está representada por valores verdaderos tanto en a[x][y] como en a[y][x]. A.

a[y][x] = 1. Sin embargo. Los vértices artificiales para el inicio de las listas se mantienen en un arreglo ady indexado por el vértice. Las listas enlazadas se construyen de la forma usual. struct vertice { int v. x <= V. A. dependiendo de la representación deseada. for (j = 1. y la lista de adyacencia de y a x. // Instrucciones para leer V y A z = new vertice. Redes int a[maxV][maxV]. y = indice(v2). x++) for (y = 1. void matrizady(){ int j. con un vértice artificial z al final (el cual apunta a sí mismo). El programa que sigue construye la estructura de adyacencia para la gráfica que estamos tomando como ejemplo. x. struct vertice *sig. agregamos la lista de adyacencia de x a y. } } Los tipos de v1 y v2 y el código para indice no se han incluído en el programa. esto puede ser aceptable porque alrededor de v2 pasos se requieren para leer las aristas en cualquier caso. y. for (x = 1. si la gráfica es escasa. x++) a[x][x] = 1. for (j = 1. a[x][y] = 1. Ingenierías y Tecnologías 13 13 . y++) a[x][y] = 0. simplemente la inicialización de la matriz puede ser el factor dominante en el tiempo de ejecución de un algoritmo. j++) { // Instrucciones para leer v1 y v2 x = indice(v1). La representación con la matriz adyacente es satisfactoria solamente si las gráficas que van a ser procesadas son densas: la matriz requiere v2 bits de almacenamiento y v2 pasos sólo para inicializarla. v1 y v2 pueden ser del tipo carácter e indice puede ser una simple función que devuelva c – ‘A’ + 1 o algo parecido. En la representación de la estructura de adyacencia todos los vértices conectados a cada vértice están listados en una lista de adyacencia para ese vértice. int V. struct vertice *ady[maxV]. }. Para agregar a esta representación de la gráfica una arista conectando x a y. z->next = z. Por ejemplo. *z. x. x <= V. j++) Educación Abierta y a Distancia * Ciencias Exactas. Analicemos ahora una representación que es más adecuada para gráficas que no son densas. struct vertice *t. y <= V. // Instrucciones para leer V y A for (x = 1. Si el número de aristas (número de bits 1 en la matriz) es proporcional a v2. pero pueden agregarse fácilmente.Programa desarrollado Unidad 3. y. void listaady() { int j. Esto puede ser realizado fácilmente con listas enlazadas. j <= A. j <= V.

Nota que. La representación de lista de adyacencia es mejor para gráficas escasas porque el espacio requerido es menor comparado con el espacio requerido por la representación de matriz de adyacencia. j++) { // Instrucciones para leer v1 y v2. Educación Abierta y a Distancia * Ciencias Exactas. for (j = 1. x = indice(v1). y = indice(v2). t->sig = ady[x]. El orden en el cual las aristas aparecen en la lista de adyacencia afecta. Ingenierías y Tecnologías 14 14 . puede llegar a la respuesta a través de secuencias muy diferentes de cálculos. t->v = y. Si hay más de una “respuesta correcta”. Mientras que un algoritmo debe producir una respuesta correcta sin importar cómo están ordenadas las aristas en las listas de adyacencia. la misma gráfica puede ser representada de muy diversas formas en una estructura de este tipo. de otra manera. t->v = x. ady[x] = t. t->sig = ady[y]. el orden en el cual las aristas son procesadas por los algoritmos. preguntas simples como “¿Cuáles vértices están conectados directamente al vértice x?” no pueden ser respondidas eficientemente. de nuevo. t = new vertice. Es importante incluir ambas porque. cada arista está representada dos veces. Debido a esto. ady[y] = t. a su vez.Programa desarrollado Unidad 3. el orden en el que las aristas aparecen en la entrada es muy importante: determina el orden (junto con el método de inserción de lista utilizado) en el cual los vértices aparecen en las listas de adyacencia. j <= A. } } La figura siguiente muestra la representación con estructura de adyacencia construida por el programa anterior. t = new vertice. Para esta representación. Redes ady[j] = z. los diferentes órdenes de entrada pueden producir diferentes resultados de salida.

Para las gráficas ponderadas.Programa desarrollado Unidad 3. o en arreglos auxiliares indexados por el número de arista (esto requiere la numeración de las aristas). excepto que cada arista está representada sólo una vez: una arista de x a y está representada por un 1 en a[x][y] en la matriz de adyacencia o por la aparición de y en la lista de adyacencia de x dentro de la estructura de adyacencia. Ingenierías y Tecnologías 15 15 . y todas las aristas conectadas a él. Este problema puede ser corregido enlazando los dos vértices que corresponden a una arista en particular y haciendo las listas de adyacencia doblemente enlazadas. Para las gráficas dirigidas. Tales consideraciones también aclaran por qué no utilizamos una representación “directa” para las gráficas: una estructura de datos que modele la gráfica exactamente. el cual “visita” cada vértice y revisa cada arista de la gráfica sistemáticamente. Es a menudo necesario asociar otra información con los vértices de una gráfica para permitirle modelar objetos más complicados o para ahorrar información de control en algoritmos complicados. Educación Abierta y a Distancia * Ciencias Exactas. para agregar una arista a una gráfica representado de esta manera. o incluir en la estructura de adyacencia un campo para el peso de la arista dentro de los registros de la lista de adyacencia. y no deberían ser incluidos a menos que se requieran operaciones como la eliminación. Discutiremos a continuación un método llamado búsqueda en profundidad (depth-first search en inglés). Así. Las gráficas dirigidas y ponderadas se representan con estructuras similares. Por ejemplo. con vértices representados por registros asignados y listas de aristas conteniendo enlaces a los vértices en lugar de nombres de vértice. La información extra asociada con cada arista puede ser colocada en los vértices de la lista de adyacencia (o en un arreglo a de registros en la representación de matriz de adyacencia). La información extra asociada con cada vértice puede ser acomodada utilizando arreglos auxiliares indexados por el número de vértice o haciendo ady un arreglo de registros en la representación de estructura de adyacencia. Por ejemplo. empezamos inmediatamente a hacernos preguntas: ¿Es la gráfica conexa? Si no. las operaciones simples se vuelven desafiantes. Sin un acceso directo a los vértices. los dos vértices correspondientes a esa arista pueden ser eliminados rápidamente. de nuevo todo es lo mismo excepto que se llena la matriz de adyacencia con pesos en lugar de valores booleanos (utilizando algún peso no existente para representar la ausencia de una arista). se tendría que buscar de alguna manera a través de la gráfica para encontrar los vértices. si se desea eliminar un vértice x. ¿Cuáles son sus componentes conexos? ¿La gráfica tiene un ciclo? Estos y otros problemas pueden ser resueltos con diversos algoritmos. Por supuesto. todo es lo mismo. Recorrido en Profundidad Cuando hablamos de redes y gráficas. Redes Algunas operaciones simples no son soportadas por esta representación. estos enlaces extra son incómodos de procesar. si una arista va a ser removida. no es suficiente eliminar vértices de la lista de adyacencia: cada vértice en esta lista especifica otro vértice cuya lista de adyacencia debe ser examinada para eliminar un vértice correspondiente a x.

Programa desarrollado Unidad 3. Redes Comencemos por concentrarnos en la forma de examinar cada pieza de la gráfica de una manera organizada:   Utilizamos un arreglo vid[V] para registrar el orden en el que los vértices son visitados. void recorrer() { int k. for (k = 1. for (k = 1. } Educación Abierta y a Distancia * Ciencias Exactas. estableciendo en la entrada vid correspondiente el id del vértice i visitado. Nota que este método no depende de cómo la gráfica está representada o de cómo visitar es implementada. vid[k] = ++id. se les hace la visita. lo cual tiene como resultado que los valores vid de todos los vértices conectados a ese vértice son modificados a valores diferentes de “novisitado”. en el que id = 1. Una posible implementación recursiva de visitar para la representación de lista de adyacencia sería:    Visitar un vértice. k <= V. Ingenierías y Tecnologías 16 16 . Luego visitar es llamada para el primer vértice. for (t = ady[k]. v. k++) vid[k] = novisitado. El siguiente programa utiliza una función visitar que visita todos los vértices del mismo componente conexo con el vértice dado como argumento. t != z. 2. k <= V. La meta es visitar sistemáticamente todos los vértices de la gráfica.…. continuando de esta manera hasta que todos los vértices han sido visitados. t = t->siguiente) if (vid[t->v] == novisitado) visitar(t->v). Si esto es así. } El primer ciclo for inicializa el arreglo vid. Luego recorrer explora el arreglo vid para encontrar un vértice que todavía no ha sido visitado y llama visitar para ese vértice. Cada entrada o “celda” en el arreglo se inicializa con el valor de “novisitado” para indicar que ningún vértice ha sido visitado todavía. k++) if (vid[k] == novisitado) visitar(k). Revisar todas sus aristas para ver si llevan a vértices que todavía no han sido visitados. void visitar(int k) { struct vertice *t.

Redes En la figura siguiente se puede seguir la operación del algoritmo. Las líneas punteadas corresponden a aristas de vértices que ya habían sido visitados. Diferencia con el algoritmo Recorrido en Profundidad (Depth-First Search). así que la prueba if en visitar falló. Ingenierías y Tecnologías 17 17 . Educación Abierta y a Distancia * Ciencias Exactas. 2. Formen equipos de 4 o 5 integrantes. i. pero no se definen (Búsqueda en Profundidad No Recursivo (Nonrecursive Depth-First Search) y Búsqueda en Amplitud (Breadth-First Search). Están trazadas las llamadas recursivas durante la función visitar. Recorrido en Profundidad No Recursivo (Nonrecursive Depth-First Search). la prueba if en visitar también evita que se siga la arista la segunda vez que es encontrada. Es importante notar que este bosque de árboles de recorrido en profundidad es sólo otra manera de trazar la gráfica: el algoritmo examina todos los vértices y aristas de la gráfica. denominado árbol de búsqueda en profundidad del componente. ii. Estos comentarios se aplican a la primera vez en que cada arista es encontrada. Las líneas sólidas indican que el vértice inferior fue encontrado por el algoritmo en la lista de aristas del vértice superior y que no había sido visitado en ese momento. y la arista no fue “seguida” con una llamada recursiva. Existen algoritmos similares que pueden utilizarse alternativamente como el de búsqueda en profundidad no recursivo o el de búsqueda en amplitud. así que una llamada recursiva fue hecha.Programa desarrollado Unidad 3. Colabora con tu equipo en el diseño de una wiki que responderá al título: Algoritmos de Recorrido 3. Investiga sobre los siguientes temas: a. Actividad 1. Instrucciones: 1. Cada componente conexo lleva a un árbol. Descripción. Fundamentos de redes A través de esta actividad podrás identificar dos tipos de búsqueda que se mencionan en el contenido.

Los entornos reales. Puedes ver que existe una Educación Abierta y a Distancia * Ciencias Exactas. las fuentes de información que consultaste para el desarrollo de la misma y los nombres de los participantes. al menos con tres aportaciones.2. dependiendo de las situaciones prácticas en las que se presenta. Se han estudiado muchas diferentes versiones del problema. Diferencia con el algoritmo Recorrido en Profundidad No Recursivo (Nonrecursive Depth-First Search). Para simplificar el trabajo que iniciaremos acerca de esto podemos suponer también que la red tiene una sola fuente (digamos. un campo petrolero) y un solo destino (digamos. que discutimos la forma en que las gráficas pueden representarse dentro de una computadora y que nos introdujimos a algoritmos que son capaces de proporcionar respuestas a preguntas básicas acerca de las gráficas. . por supuesto. ii. Existe una infinidad de problemas originados por las redes. por ejemplo. los siguientes elementos: introducción. iii. Podemos considerar. ¿Cuáles son las configuraciones de válvulas que maximizan la cantidad de petróleo fluyendo de la fuente al destino? Interacciones complejas que implican el flujo de material en las uniones hacen que este problema de flujo en una red no sea trivial en su solución.Programa desarrollado Unidad 3. Participa. Código en C o en Java de la función básica. Flujo Ya que repasamos un poco la teoría de gráficas. Código en C o en Java de la función básica. i. el código en C o en Java de la función básica (suele ser expresable en 15-20 líneas de código). así que los algoritmos deben ajustarse a la situación. 5. explicación del funcionamiento de los algoritmos. es importante que respetes las aportaciones de tus compañeros y cualquier modificación sea con fundamentos. b. modificar y eliminar información ingresada por ti y por tus compañeros. Recorrido en Anchura (Breadth-First Search). una refinería) a los cuales se conectan la tubería. una red petrolera con tubería de diversos tamaños interconectada de formas complejas con válvulas controlando la dirección del flujo en las uniones. etc. Este escenario general también puede ser usado para describir el flujo de tráfico en las autopistas. 3. dos links para conocer más algunos de los temas. Ingenierías y Tecnologías 18 18 . Redes iii. Tienes la posibilidad de ingresar. pueden tener varias fuentes y varios destinos. Descripción. conclusiones. desarrollo (información generada por ti). La wiki que ayudes a construir debe contener al menos. pero uno de los problemas típicos es el del flujo de materias primas u otros elementos a través de ellas. de materiales moviéndose dentro de las fábricas. podemos volver a lo que dio origen a todo este trabajo: las redes. 6. diferencia con el otro algoritmo que se menciona. 4.

La figura siguiente ilustra que sí afecta.Programa desarrollado Unidad 3. Sin importar el estado de las válvulas el sistema alcanza un punto de equilibrio cuando la cantidad de petróleo entrando al sistema por la parte superior es igual a la cantidad saliendo por la parte inferior (esta es la cantidad que queremos maximizar). válvulas en cada unión controlan cuánto petróleo pasa en cada dirección. Flujo máximo Considera el diagrama idealizado de una pequeña red de tuberías de petróleo que se muestra a continuación: Las tuberías son de capacidad fija proporcional a su tamaño y el petróleo puede fluir solamente de arriba hacia abajo. A continuación supongamos que el tubo AC se abre y la válvula C se mueve para cerrar el tubo CD y abrir el tubo CE (quizás el operador de la válvula D ha informado al operador de la válvula C que ya no puede aceptar más debido a la carga desde B). llenando ese tubo.2. pero la solución de problemas específicos como el del flujo en una red. supongamos que se abre la válvula que controla el tubo AB. Redes motivación muy fuerte para encontrar un algoritmo eficiente que ofrezca una solución adecuada. Ingenierías y Tecnologías 19 19 . Primero. Educación Abierta y a Distancia * Ciencias Exactas. Existen métodos matemáticos complejos para tratar los problemas de investigación de operaciones. el tubo BD. El flujo resultante se muestra en el diagrama central de la figura: los tubos BD y CE están llenos.1. El problema continúa siendo estudiado activamente. El flujo en las redes es un ejemplo típico de problemas del área de investigación de operaciones. litros por segundo). la “mejor” solución todavía no ha sido encontrada y nuevos algoritmos siguen siendo descubiertos. así que es posible desarrollar un programa que resuelva el problema utilizando las herramientas algorítmicas que ya hemos empezado a examinar. Ahora. y cuando la cantidad de petróleo fluyendo hacia cada unión es igual a la cantidad saliendo de ella. está estrechamente relacionada a los algoritmos de gráficas. y casi llenando DF. Medimos tanto el flujo como la capacidad de la tubería en términos de unidades enteras (por ejemplo. Además. como se muestra en el diagrama izquierdo de la figura. No es obvio inmediatamente que la configuración de las válvulas pueda afectar realmente el flujo máximo total. 3.

es necesario mantener enlaces conectando los dos vértices de lista que representan cada arista. como dos matrices en la matriz de adyacencia. también mantenemos una arista de y a x con tamaño –s y flujo –f. El flujo total entrando y saliendo de la red se incrementa encontrando la configuración adecuada de válvulas. así que utilizamos una representación de gráfica no-dirigida: si existe una arista de x a y con tamaño s y flujo f. como se muestra en el tercer diagrama. Aunque las redes son gráficas dirigidas. Las redes pueden ser representadas por medio de la matriz de adyacencia o por la lista de adyacencia que utilizamos para gráficas anteriormente. Cambiando la válvula B para redirigir suficiente flujo para llenar BE. Ingenierías y Tecnologías 20 20 . pero hay una mejor solución. Redes el flujo podría ser incrementado en alguna medida enviando lo suficiente a través de la trayectoria ACDF para llenar el tubo DF. En una representación de lista de adyacencia. y el flujo entrando en cada vértice es igual al flujo saliendo de ese vértice. En lugar de un solo peso. Esta situación puede ser modelada por una gráfica dirigida. El valor del flujo es el flujo de la fuente. los algoritmos necesitan atravesar las aristas en la dirección “equivocada”. Educación Abierta y a Distancia * Ciencias Exactas. o por dos campos dentro de un solo registro en cualquier representación. Estos pueden ser representados por dos campos en un vértice de la lista de adyacencia. El problema del flujo de red es encontrar un flujo con valor máximo para una red dada. de manera que cuando cambiemos el flujo en uno podamos actualizarlo en el otro. Podemos definir el problema del flujo máximo de una forma más precisa como sigue. el tamaño y el flujo. queremos estar seguros que ninguna otra configuración de válvulas permitirá un flujo mayor. se denominan capacidades de vértice. Definimos una red como una gráfica ponderada dirigida con dos vértices distinguibles: uno sin aristas apuntando hacia el interior (la fuente) y otro sin aristas apuntando hacia el exterior (el destino). Un flujo se define como otro conjunto de pesos en las aristas de manera que el flujo en cada arista es igual a o menor que la capacidad. que asumimos como no-negativos.Programa desarrollado Unidad 3. proporcionamos suficiente capacidad en el tubo DF para permitir a la válvula C abrir completamente el tubo CD. Además. dos pesos están asociados con cada arista. Nuestro desafío es desarrollar un algoritmo que pueda encontrar la configuración “apropiada” de válvulas para cualquier red. Los pesos en las aristas.

una red de flujo no tendrá aristas hacia la fuente. Un flujo en G es una función con valor real que satisface las siguientes dos propiedades: Restricción de la capacidad: Para todo Conservación del flujo: Para todo ∑ ∑ { . no puede haber flujo desde u a v. Sea s la fuente de la red. Estamos listos ahora para definir los flujos más formalmente. Ingenierías y Tecnologías 21 21 .) Típicamente. y el flujo hacia la fuente dado por la sumatoria ∑ será 0. el flujo total saliendo de la fuente menos el flujo entrando a la fuente (aquí. dado que cada vértice diferente de s tiene al menos una arista entrante. Educación Abierta y a Distancia * Ciencias Exactas. porque cuando se introducen redes residuales. la red de flujo contiene una trayectoria . entonces | | | | . Cuando . y no aceptamos auto-ciclos. no valor absoluto o cardinalidad. la notación | f | denota el valor del flujo. sin embargo. El valor | | de un flujo f se Llamamos a la cantidad no-negativa define como | | ∑ ∑ esto es. para cada vértice . Redes Redes de Flujo y Flujos Una red de flujo no-negativa es una gráfica dirigida en la cual cada arista .Programa desarrollado Unidad 3. se requiere }. Si . el flujo hacia la fuente se vuelve significativo. . Distinguimos dos vértices en una red de flujo: una fuente s y un destino t. Sea una red de flujo con una función de capacidad c. y sea t el destino. entonces por conveniencia definimos . La gráfica es por lo tanto conexa y. entonces no existe una arista en la dirección tiene una capacidad Requerimos además que si A contiene una arista inversa. asumimos que cada vértice se encuentra en alguna trayectoria de la fuente al destino. se requiere . Esto es. Lo incluimos. y el flujo del vértice u al vértice v. Por conveniencia.

En cualquier red. y cortes. AD. Educación Abierta y a Distancia * Ciencias Exactas. es igual a la capacidad del corte mínimo que separa a la fuente del destino. CT} {CT. Como puedes ver. DT. también es el flujo máximo que puede fluir de la fuente al destino.Programa desarrollado Unidad 3. La propiedad de conservación del flujo dice que el flujo total entrando un vértice que no sea la fuente o el destino debe ser igual al flujo total saliendo de ese vértice –dicho informalmente. “el flujo de entrada es igual al flujo de salida. Para definirlo formalmente. CD. El número que se muestra junto a cada arista representa su capacidad máxima. La siguiente tabla contiene los cortes de separación y sus capacidades. necesitaremos de tres conceptos: redes residuales. cada uno con capacidad diferente. de acuerdo al teorema. Este corte mínimo de separación puede no ser único.” 3. Redes En el problema del flujo máximo. Ingenierías y Tecnologías 22 22 . DT} Corte mínimo Capacidad 17 17 16 14 El corte mínimo es el cuarto de la lista con una capacidad de 14 unidades. En la figura siguiente se muestra una red de ejemplo que tiene varios cortes. se nos da una red de flujo G con fuente s y destino t.2. Aristas en el corte de separación {SA.2. y deseamos encontrar un flujo de valor máximo. Teorema del corte mínimo y flujo máximo Teorema. BD. Un artículo de Lester Randolph Ford Jr. ET} {BE. la esencia del teorema es sencilla. SB} {BE. el flujo máximo que fluye de la fuente al destino. La restricción de capacidad dice simplemente que el flujo de un vértice a otro debe ser no-negativo y que no debe exceder la capacidad dada. trayectorias de aumento. y de Delbert Ray Fulkerson (1962) discutiendo el problema del flujo máximo estableció este famoso teorema. CT.

puede necesitar disminuir el flujo en una arista particular. se pone esa arista Gf con una “capacidad residual” de . T) se define como y . A) y un flujo f. se puede incrementar el flujo en una arista ( u. una arista que puede admitir un flujo en la dirección opuesta a . dada una red de flujo G = (V. Para representar una posible disminución de un flujo positivo en una arista en G. A medida que un algoritmo manipula el flujo. dada por { Cortes de Redes de Flujo Un corte (S. definimos la capacidad residual como { Trayectorias de Aumento Dada una red de flujo G = (V. La red residual Gf también puede contener aristas que no están en G.Programa desarrollado Unidad 3. Ingenierías y Tecnologías 23 23 . Si el valor es positivo. Llamaremos a la máxima cantidad por la cual se puede incrementar el flujo en cada arista en una trayectoria de aumento p la capacidad residual de p. con la meta de incrementar el flujo total. Educación Abierta y a Distancia * Ciencias Exactas. El devolver flujo por una arista es equivalente a disminuir su flujo. a lo más cancelando el flujo en . la red residual Gf consiste de aristas con capacidades que representan cómo se cambia el flujo en las aristas de G. Las únicas aristas de G que están en Gf son aquellas que pueden admitir más flujo. E) es una partición de V en S y T = V – S tal que f es un flujo. A) con fuente s y destino t. Más formalmente. Por la definición de red residual. esto es. se pone una arista en Gf con una capacidad residual . Estas aristas invertidas en la red residual permiten que un algoritmo devuelva flujo que ya ha enviado por una arista. Una arista de la red puede admitir una cantidad de flujo adicional igual a la capacidad de la arista menos el flujo en esa arista. un flujo f en G. Si }. u) en la red original G. las aristas cuyo flujo iguala a su capacidad tienen . v) de una trayectoria de aumento por hasta sin violar la restricción de capacidad de (u. Redes Redes Residuales Dada una red de flujo G y un flujo f. y considerando un par de vértices . una trayectoria de aumento p es una trayectoria simple de s a t en la red residual Gf . sin embargo. T) de una red de flujo G = (V. T) a través del corte (S. entonces el flujo neto f(S. la cual es una operación necesaria en muchos algoritmos. v) y (v. y no están en Gf.

Puedes encontrar todos los desarrollos y demostraciones matemáticas de este teorema en: Cormen. Algoritmo de corte mínimo y flujo máximo Ford y Fulkerson desarrollaron un método para encontrar el flujo máximo alrededor del teorema. se aplica el método repetidamente. contamos solamente las capacidades de las aristas que van de S a T.3. Educación Abierta y a Distancia * Ciencias Exactas. Massachusetts USA. R. Stein. Para flujo. 2. produce un aumento de flujo. 3. The MIT Press. T) es ∑∑ Un corte mínimo de una red es un corte cuya capacidad es mínima sobre todos los cortes de la red.2. | | para algún corte de G. Comenzando con un flujo cero. si no puede ser aplicado.Programa desarrollado Unidad 3. Ingenierías y Tecnologías 24 24 . Redes ∑∑ ∑∑ La capacidad del corte (S.. Leiserson. consideramos el flujo que va de S a T menos el flujo que va en la dirección opuesta de T a S. (2009) Introduction to Algorithms. E) con fuente s y destino t. Cambridge. f es un flujo máximo en G. Para capacidad. ignorando las aristas en la dirección opuesta. Mientras que el método pueda ser aplicado. 3rd Ed.. entonces las siguientes condiciones son equivalentes: 1. Rivest. C. 3. T. Examinaremos el método en términos de la gráfica de la siguiente figura. Versión Formal del Teorema del Corte Mínimo y Flujo Máximo Si f es un flujo en una red de flujo G = (V. Esto equivale a lo que enunciamos al principio de esta sección: el valor del flujo máximo es igual a la capacidad de un corte mínimo. el flujo máximo ha sido encontrado. C.. La asimetría entre las definiciones de flujo y capacidad de un corte es intencional e importante. La red residual Gf no contiene trayectorias de aumento.

Educación Abierta y a Distancia * Ciencias Exactas. esto corresponde a agregar 3 unidades de flujo a través de AC y CD. como se muestra en el tercer diagrama de la figura. Redes Para simplificar.Programa desarrollado Unidad 3. En el diagrama izquierdo de la figura. podemos entonces aplicar la regla a lo largo de la trayectoria ACDF. Pero existe otra manera de incrementar el flujo: podemos considerar trayectorias arbitrarias a través de la red que pueden contener aristas que apuntan en la “dirección equivocada” (del destino hacia la fuente a lo largo de la trayectoria). el flujo a través de la red puede ser aumentado en 3 a lo largo de la trayectoria ACDBEF. Ingenierías y Tecnologías 25 25 . es aplicada a lo largo de la trayectoria ACEF. Dicho de otra manera. incrementando el flujo en todas las aristas de la trayectoria por esa cantidad. En el ejemplo. Como mencionamos anteriormente. creando una situación en la que todas las trayectorias dirigidas a través de la red tienen al menos una arista llena hasta su capacidad. Como describimos anteriormente. Para simplificar la terminología. Consideremos cualquier trayectoria dirigida (hacia abajo) a través de la red (de la fuente al destino). omitimos las flechas. en el nuevo flujo. El flujo puede ser aumentado a lo largo de tal trayectoria aumentando el flujo en aristas de la fuente al destino y disminuyendo el flujo en aristas del destino a la fuente por la misma cantidad. llamaremos a las aristas que fluyen de la fuente al destino a lo largo de una trayectoria particular aristas hacia adelante. por supuesto. El método no está restringido. Usamos estas gráficas porque ayudan a entender el flujo de la red en términos de líquidos fluyendo en tubos. luego en el diagrama central. al menos una de las aristas hacia adelante a lo largo de la trayectoria se llena o al menos una de las aristas hacia atrás a lo largo de la trayectoria queda vacía. dado que todas apuntan hacia abajo. y las aristas que fluyen del destino a la fuente aristas hacia atrás. Nota que la cantidad por la cual el flujo puede ser aumentado está limitada por el mínimo de las capacidades no usadas en las aristas hacia adelante y el mínimo de los flujos en las aristas hacia atrás. No perdemos ningún flujo en DF porque 3 de las unidades que venían de BD ahora vienen de CD. el flujo puede ser incrementado por al menos la cantidad más pequeña de la capacidad no utilizada en cualquier arista de la trayectoria. a gráficas que pueden ser trazadas con todas las aristas apuntando en una dirección. Claramente. esta regla se aplica a lo largo de la trayectoria ABDF. luego desviando 3 unidades en la válvula B de BD a BE y EF.

El párrafo anterior proporciona un método para incrementar el flujo en cualquier red. En general. el cual es igual al flujo total para la red. Resulta que cuando el flujo del corte es igual al flujo total. Si todas las trayectorias de la fuente al destino en una red tienen una arista hacia adelante llena o una arista hacía atrás vacía. Para probar este hecho. continuando hasta que no existan tales trayectorias en la red. Redes Además. Ingenierías y Tecnologías 26 26 . Propiedad. En este ejemplo. uno puede basar el método en la intuición que entre más larga la trayectoria. Esto corresponde al teorema de corte mínimo – flujo máximo: el flujo no puede ser mayor (de otra manera el corte tendría que ser mayor también). El método Ford y Fulkerson puede ser resumido como sigue: “empieza con flujo cero por doquier e incrementa el flujo a lo largo de cualquier trayectoria de la fuente al destino que no tenga aristas hacia delante llenas o aristas hacia atrás vacías.Programa desarrollado Unidad 3. Para cualquier corte de la red en dos partes. Por ejemplo. Pero el ejemplo clásico que se muestra en la siguiente figura demuestra que se debe tener cuidado con esto. Educación Abierta y a Distancia * Ciencias Exactas. podemos medir el flujo “a través” del corte: el total del flujo en las aristas que van de la fuente al destino. CD. el flujo no puede ser incrementado en cualquier trayectoria que contenga una arista hacia delante llena o una arista hacia atrás vacía. y CE conforman el corte. dado que el método para encontrar trayectorias no está especificado. y no existen cortes menores (de otra forma el flujo tendría que ser también menor). y cualquier trayectoria puede ser usada. El punto esencial del método es la observación de que si tal trayectoria no puede ser encontrada entonces el flujo es máximo. sino también que el corte es mínimo (esto es. la red está más llena. Este conjunto de aristas corta la gráfica en dos partes. entonces el flujo es máximo. las aristas pueden ir en ambas direcciones a través del corte: para obtener el flujo a través del corte. Nuestro corte de ejemplo tiene un valor de 12. a condición de que una trayectoria sin aristas hacia adelante llenas o aristas hacia atrás vacías pueda encontrarse.” Esto no es un algoritmo en el sentido usual. examinamos la gráfica e identifiquemos la primera arista hacia adelante llena o hacia atrás vacía en cada trayectoria. el total del flujo en las aristas yendo en la otra dirección deben ser restadas. las aristas AB. cualquier otro corte tiene al menos un flujo tan alto que lo cruza). de manera que las trayectorias largas deberían ser preferidas. sabemos no solamente que el flujo es máximo.

Este hecho fue probado por Edmonds y Karp en 1972. Sería un buen ejercicio que implementaras el algoritmo en tu computadora: También puedes experimentar interactivamente en estos dos sitios con el algoritmo de Ford y Fulkerson: http://people. Educación Abierta y a Distancia * Ciencias Exactas.2.. 1st Ed. fue introducido un método alternativo basado en el concepto de preflujo de Karzanov. Inc.html http://www. En este método. y dejando una situación idéntica a la situación inicial. esta es una situación indeseable. Más tarde. el cual presentamos desarrollado en la última sección de la unidad. este problema puede ser eliminado fácilmente: Propiedad. Si los números en los lados fueran un billón. USA” puedes encontrar inclusive el código en Java. Para esto se puede utilizar una versión modificada apropiadamente del algoritmo de recorrido en anchura que mencionamos en la sección 3.ca/~aaw/Wang/MaxFlowStart.pitt. en el libro de “Heineman. ya sea una trayectoria a la vez (como en el algoritmo original de Ford and Fulkerson) o todas las trayectorias de aumento de longitud más corta a la vez (método de Dinic).edu/~kirk/cs1501/animations/Network. El algoritmo termina cuando ya no hay más excesos. entonces el flujo es aumentado en sólo 1.Programa desarrollado Unidad 3. requiriendo 1000 pares de iteraciones antes de que el flujo máximo sea encontrado. de nuevo aumentando el flujo en 1. Pollice. entonces el número de trayectorias utilizadas antes de que se encuentre el flujo máximo en una red de V vértices y A aristas debe ser menor que VA. Cualquier algoritmo que escoja estas dos trayectorias (por ejemplo. Algorithms in a Nutshell. G.cs. Redes En esta red.yorku.1. entonces se usarían dos billones de iteraciones.htm Al principio sólo se conocían algoritmos eficientes para el flujo máximo que trabajaban encontrando trayectorias de aumento. Por ejemplo. excepto que los flujos en las aristas exteriores son aumentados en uno. uno que busque las trayectorias largas) continuaría con esta estrategia. Selkow. Ingenierías y Tecnologías 27 27 . Afortunadamente. Los excesos son empujados hacia t. Entonces la segunda trayectoria escogida puede ser ACBD. para un vértice fuente s dado y un vértice destino t. mientras que se satisface la restricción que el flujo de entrada debe ser igual al flujo de salida en cada vértice. G. Si la trayectoria más corta disponible de la fuente al destino se utiliza en el método Ford y Fulkerson.cse. S. dado que las trayectorias ABC y ADC dan el flujo máximo en sólo dos pasos. Los algoritmos básicos que usan el método de Ford y Fulkerson están ampliamente desarrollados por varios autores. debemos evitar que el tiempo de ejecución sea tan dependiente de la magnitud de las capacidades. produciendo excesos en los vértices adyacentes de s. Obviamente. si la primera trayectoria escogida es ABCD. Los excesos que no pueden alcanzar el destino debido a las restricciones de capacidad son regresados a s. el algoritmo comienza con un preflujo inicial en el que todas las aristas de s tienen capacidad residual cero. (2009) O’Reilly Media. Para que el algoritmo sea útil..

Soviet Math. Algoritmos de corte mínimo y flujo máximo. Investiga sobre los siguientes temas: a. Guarda tu documento con la siguiente nomenclatura MCOM1_U3_A2_XXYZ. i.2. Teoremas y algoritmos de flujo A través de lo aprendido en la sección 3. Redes El algoritmo y su análisis son simples e intuitivos. Un punto extra a favor es que el algoritmo también admite implementaciones distribuidas y paralelas eficientes.. Actividad 2.2. 4.1. No. Pseudocódigo 3. realiza el siguiente reporte de investigación tomando en cuenta el algoritmo de Ford y Fulkerson. la Y por la inicial de tu apellido paterno y la Z por la inicial de tu apellido materno. (1988) A New Approach to the Maximum-Flow Problem. A. así como una corrida de ejemplo con sus resultados. Y puede descargarse de: http://alexander-karzanov.3. ii. Descripción. 434-437. En la sección 3. adecuadas para los nuevos entornos de cómputo. Escribe un reporte que llevará por nombre Teoremas y algoritmo de flujo 2. Journal of the Association for Computing Machinery. Te recomendamos que lo pruebes en tu IDE Eclipse con otros ejemplos que propongas.Programa desarrollado Unidad 3. 15. Ingenierías y Tecnologías 28 28 .html Un artículo en inglés que discute detalles del algoritmo y que puede encontrarse en internet es el siguiente: Goldberg. Tarjan. A. Sustituye las XX por las dos primeras letras de tu primer nombre. Algoritmo de Ford-Fulkerson. Dokl.. Vol. Instrucciones 1.4. R. El artículo original (en ruso) en el que se presenta este método es el siguiente: Karzanov. 4. aunque el algoritmo se ejecuta tan rápido para gráficas de cualquier densidad como cualquier otro método conocido o más cuando se incorporan estructuras dinámicas de datos. Envía tu documento a tu Facilitador(a) y espera su retroalimentación Educación Abierta y a Distancia * Ciencias Exactas. 35.net/flows&multiflows. (1974) Determining a Maximal Flow in a Network by the Method of Preflows. V. No. Solución de Problemas de Redes se presenta el desarrollo de este algoritmo incluyendo el pseudocódigo y el código en Java del programa. Y las instrucciones mencionadas a continuación.

mientras que la gráfica de la derecha sólo tiene una. Pongamos esta observación en términos rigurosos. Una gráfica es conexa si para cada par de vértices u y v. Los vértices corresponden a centros de comunicación y las aristas a canales de comunicación. Conexidad En una gráfica conexa hay al menos una trayectoria entre cada par de sus vértices. Redes 3. la gráfica contiene una trayectoria con puntos extremos u y v como sub-gráfica. o ambos. Sin embargo. Conexidad En el siguiente diagrama. se rompe la comunicación. Educación Abierta y a Distancia * Ciencias Exactas.3. así que la red depende de la conexidad. Ingenierías y Tecnologías 29 29 . La gráfica de la izquierda no es conexa porque no hay una trayectoria de cualquiera de los tres vértices superiores a cualquiera de los dos vértices inferiores. Consideremos por ejemplo una red de comunicaciones representada por la gráfica que se muestra en la siguiente figura. la gráfica se convierte en disconexa. Esto implica que en esta red el centro representado por el vértice v tiene la propiedad de destruir el sistema de comunicaciones.Programa desarrollado Unidad 3. la gráfica de la izquierda tiene dos piezas. la gráfica de la derecha es conexa porque existe una trayectoria entre cada par de vértices. Un vértice o una arista tienen la propiedad de destruir la conexidad de la gráfica si cuando se elimina uno de los dos. Si se elimina el vértice v.

(Por máxima. 4. en la gráfica de la siguiente figura. La remoción de una arista puede incrementar el número de componentes por a lo más uno. Un vértice v de G es denominado vértice de corte de G si . Cada vértice no-colgante de un árbol es un vértice de corte. Los vértices finales de una arista de corte son vértices de corte si su grado es mayor que uno. La gráfica de la derecha es conexa completamente así que tiene un solo componente conexo. Por ejemplo. Arista de corte: Una arista a de una gráfica G es denominada arista de corte si . Las siguientes observaciones son las consecuencias inmediatas de las definiciones anteriores: 1. Teorema de Conexidad Cada gráfica tiene al menos | | | | componentes conexos. Toda gráfica conexa con n vértices tiene al menos n-1 aristas. Ingenierías y Tecnologías 30 30 . Corolario. Conceptos Básicos Vértice de corte: Sea G una gráfica con k(G) componentes. La remoción de un vértice puede incrementar el número de componentes en una gráfica por al menos uno.Programa desarrollado Unidad 3. queremos decir que el incluir cualesquiera vértices adicionales volverá disconexa la sub-gráfica. e y f son aristas de corte. 3. En la gráfica de la siguiente figura.) La gráfica de la izquierda tiene dos componentes conexos. Educación Abierta y a Distancia * Ciencias Exactas. 2. los vértices u y v son vértices de corte. el triángulo y la arista independiente. Redes Una sub-gráfica conexa máxima se denomina componente conexo.

Esta gráfica tiene una conexidad puntual de 1. se dice que la gráfica es k-conexa (o k-vértices conexa). Si . Por ejemplo. Lo siguiente caracteriza las aristas de corte: Para una gráfica conexa G. Educación Abierta y a Distancia * Ciencias Exactas.1.3. { } tales { } para con y 3. a es una arista de corte de G. b. las siguientes declaraciones son equivalentes: a. también se deben eliminar las aristas que inciden en él. Cuando . Recuerda que una gráfica completa es una gráfica no dirigida en la que se conecta cada par de vértices distintos por una arista única. entonces v es un vértice de corte si existen vértices que cada trayectoria en G pasa a través de v. existe una partición del subconjunto de aristas . La gráfica G2 puede ser desconectada eliminando un solo vértice (ya sea c o d). La gráfica G3 puede ser desconectada eliminando sólo un vértice: el c. Ingenierías y Tecnologías 31 31 . Cuando se elimina un vértice. consideremos las siguientes gráficas: La gráfica G1 puede ser desconectada eliminando un solo vértice (ya sea b o c). Conexidad puntual La conexidad puntual (o de vértices) k(G) de una gráfica conexa G (que no sea una gráfica completa) es el número mínimo de vértices cuya eliminación desconecta G. A) es una gráfica conexa.Programa desarrollado Unidad 3. Redes Lo siguiente caracteriza los vértices de corte: Si G(V. La gráfica tiene una conexidad puntual de 1. La gráfica tiene una conexidad puntual de 1.

Ingenierías y Tecnologías 32 32 . Redes La gráfica G4 no puede ser desconectada eliminando un solo vértice. Consideremos la siguiente gráfica Podemos desconectar la gráfica eliminando los vértices b y e. El conjunto de vértices de corte de G es {b. esto es Por ejemplo. Pero es ciertamente posible para ambas desigualdades en la expresión anterior que sean desigualdades estrictas. pero no podemos desconectarla eliminando sólo uno de ellos. con los ciclos contados dos veces. Conjunto de Vértices de Corte Un conjunto de vértices de corte de una gráfica conexa es un conjunto S de vértices con las siguientes propiedades:   La eliminación de todos los vértices en S desconecta G. La eliminación de algunos (pero no todos) de los vértices en S no desconecta G.Programa desarrollado Unidad 3. en la siguiente gráfica Educación Abierta y a Distancia * Ciencias Exactas. e}. se cumple que Donde es el grado mínimo de los vértices en G. Nota que la conexidad puntual k(G) no excede la conexidad lineal λ(G) (la veremos en la siguiente sección). Para toda gráfica G conexo. Recuerda que el grado de un vértice es el número de aristas incidentes en el vértice. pero la eliminación de dos vértices no adyacentes (tales como b y c) la desconectan. Esto se mantiene para todas las gráficas conexas. Existe una desigualdad entre siguiente teorema: descubierta por Whitney en 1932 que dio origen al Teorema. La gráfica tiene una conexidad puntual de 2.

se dice que la gráfica G tiene una conexidad lineal k. Cuando .Programa desarrollado Unidad 3. Estas aristas son denominadas puente. las siguientes gráficas Su conexidad lineal es como sigue:     G1 tiene una conexidad lineal de 1 G2 tiene una conexidad lineal de 1 G3 tiene una conexidad lineal de 2 G4 tiene una conexidad lineal de 2 G1 puede ser desconectado (dividido en dos componentes) removiendo una de las aristas: bc o bd.2. Conexidad lineal La conexidad lineal (o de aristas) λ(G) de una gráfica conexa G es el número mínimo de aristas que cuando son removidas desconectan G. Si se tienen. Redes Y la siguiente gráfica tiene 3. Educación Abierta y a Distancia * Ciencias Exactas. por ejemplo. Ingenierías y Tecnologías 33 33 .3.

G2 puede ser desconectado eliminando una sola arista. Por lo tanto. λ(G) = 0. entonces λ(G) = 1.3. Un puente es una sola arista cuya remoción desconecta un gráfica. la siguiente gráfica: Podemos desconectar G eliminando tres aristas: bd.1. Nota que un conjunto de corte es un conjunto de aristas en el cual ninguna arista es redundante. mientras que si la gráfica es conexa y posee un puente. La eliminación de algunas (pero no todas) de las aristas en S no desconecta G. Educación Abierta y a Distancia * Ciencias Exactas. la arista cd es un puente. Redes Puente. y ce. Te recomendamos que experimentes con él en tu IDE Eclipse. Solución de Problemas de Redes encontrarás el pseudocódigo. En la sección 3. por ejemplo. G3 no puede ser desconectado eliminando una sola arista. Teorema de Menger Dado que un par determinado de vértices en una gráfica puede ser conectado por muchas trayectorias.4. cd.Programa desarrollado Unidad 3.3. 3. Ingenierías y Tecnologías 34 34 . G4 puede ser desconectado eliminando dos aristas tales como ac y cd. es natural preguntarse cómo puede medirse el grado de conexidad entre ellos. Consideremos. pero no podemos desconectarlo eliminando sólo dos de ellas. Conjunto de Aristas de Corte El conjunto de aristas de corte de una gráfica conexa G es un conjunto de aristas S con las siguientes propiedades:   La eliminación de todas las aristas en S desconecta G. pero la remoción de dos aristas (tales como ac y bc) lo desconecta. el código en Java y una corrida de ejemplo de un algoritmo que encuentra la conexidad lineal de una gráfica conexa no-dirigido de n vértices resolviendo n problemas de flujo máximo de red. be. La conexidad lineal para una gráfica no conexa es cero.

Un conjunto S de vértices es un conjunto de corte v-w si v y w yacen en componentes diferentes de G – S. que no comparten otros vértices considerándolas por pares. si cada trayectoria v-w contiene un vértice en S. Una formulación equivalente del teorema establece que si V y W son conjuntos de vértices no vacíos en una gráfica. por ejemplo. el gráfico siguiente Es fácil verificar que tanto como son 3. Dado que cada trayectoria en ese conjunto debe contener un vértice diferente de todo conjunto de corte v-w. excepto para los vértices v y w. Ingenierías y Tecnologías 35 35 . El número máximo de trayectorias internamente disjuntas v-w se denota por . El teorema de Menger establece que para cada par de vértices no adyacentes estas dos medidas son iguales. Consideremos. Comprueba el resultado encontrando las tres trayectorias que no tienen vértices en común Educación Abierta y a Distancia * Ciencias Exactas. esto es.Programa desarrollado Unidad 3. El orden mínimo de un conjunto de corte v-w es denominado conexidad v-w y es denotado por Para dos vértices cualesquiera v y w. La versión del teorema para la conexidad lineal fue generalizada más tarde por un teorema que ya estudiaste: el del corte mínimo – flujo máximo. El que ambos parámetros sean iguales en este caso no es coincidencia. Otra manera de medir su conexidad es determinar el mínimo número de vértices cuya eliminación de la gráfica destruye todas las trayectorias entre el par de vértices dado. esto es. es claro que . Estamos hablando de la conexidad puntual. pero también para la conexidad lineal. Redes   Una manera de medir su conexidad es determinar el máximo número de esas trayectorias que son "independientes" una de otra. Dos trayectorias son internamente disjuntas (algunas personas las llaman puntualmente disjuntas o independientes) si no tienen ningún vértice en común. entonces el número máximo de trayectorias internamente disjuntas V-W es igual al número mínimo de vértices cuya eliminación destruye todas esas trayectorias. Karl Menger lo demostró en 1927 para la conexidad puntual. una colección de trayectorias v-w es considerada internamente disjunta si las trayectorias son disjuntas por pares. Teorema de Menger para la Conexidad Puntual Sean v y w dos vértices no adyacentes en una gráfica G. y el hecho de que esto es cierto en general es el contenido de una versión del teorema de Menger. excepto el primero y el último. El teorema es un resultado del desarrollo de la conexidad en gráficas no-dirigidas.

Dos trayectorias son linealmente disjuntas si no tienen ninguna arista en común. Programación En esta sección presentamos el desarrollo completo de dos algoritmos: uno que resuelve el problema del flujo máximo en una red. Es fácil ver que tanto como son 5. Redes excepto el inicial y el final. y el hecho que esto es cierto en general es la versión local lineal del teorema de Menger. y el otro que encuentra la conexidad lineal de una gráfica. Teorema de Menger para la Conexidad Puntual. Para cualesquiera vértices v y w en una gráfica G. 3.Programa desarrollado Unidad 3. Teorema de Menger para la Conexidad Lineal. Ingenierías y Tecnologías 36 36 . Encontrarás tanto el pseudocódigo como el código en Java que puedes probar en tu entorno IDE Eclipse. esto es. Educación Abierta y a Distancia * Ciencias Exactas. Comprueba el resultado encontrando las cinco trayectorias que no tienen aristas en común. si cada trayectoria v-w contiene una arista de S. La máxima cardinalidad de un conjunto de corte lineal v-w es la conexidad lineal vw y es denotada por . Si v y w son vértices no adyacentes en una gráfica G. El máximo número de trayectorias lineales disjuntas v-w en G se denota por tales trayectorias debe contener una arista de cada conjunto de corte lineal v-w. y un conjunto de corte puntual que contiene al menos tres vértices y separa la gráfica al eliminarlos (no encontrarás un conjunto que contenga menos de tres vértices). una mera coincidencia. Teorema de Menger para la Conexidad Lineal La versión puntual del teorema de Menger discutida en la sección anterior tiene analogías para el caso de la conexidad lineal. consideremos de nuevo la siguiente gráfica . Un conjunto S de aristas es un conjunto de aristas de corte v-w si v y w están en componentes diferentes de G – S. Dado que cada una de . y un conjunto de corte lineal que contiene al menos cinco aristas y separa la gráfica al eliminarlas (no encontrarás un conjunto que contenga menos de cinco aristas). . El que los dos parámetros sean iguales en este caso no es de nuevo. Por ejemplo. entonces el número máximo de trayectorias internamente disjuntas v-w es igual al número de vértices de un conjunto mínimo de corte v-w. Sean v y w dos vértices en una gráfica G.4.

cont1 ← 0. NP ← 0. i ← 0. Salidas: cantidad de flujo de cada vértice “flujovertice[]”. vértices del corte mínimo “cortemin[]”. Redes 3. 4. G ← false D ← false. Ejemplo: Educación Abierta y a Distancia * Ciencias Exactas. aristas1 ← 0. Teorema del Corte Mínimo y Flujo Máximo Pseudocódigo: Paso 1. Ingenierías y Tecnologías 37 37 . valores de la red: vértices de “p[ ]” a “q[ ]”. Paso 2.4. Mientras el flujo de entrada sea igual al flujo de salida del vértice Los excesos son conducidos hasta el destino Si los excesos no alcanzan a llegar al destino. 5.Programa desarrollado Unidad 3. F ← false. C ← false. B ← false. 6. aristas2 ← 0. salida ← 0. NX ← 0 termino ← false. 2. cont2 ← 0 fin ← 0. Flujo máximo y corte mínimo. Fin. NV ← 0. aux ← 0. Se empieza con un preflujo en donde las aristas de la fuente tienen una capacidad residual de cero. Inicialización de variables cortemin[vertice+1] ← 0 flujovertice[vertice+1] ← 0 flujoarista[aristas+aristas+1] ← 0 primarista[vertice+1] ← 0 mapeoi[vertice+1] ← 0 mapeoj[vertice+1] ← 0 flujo ← 0. sumidero o destino “destino”.1. Si ya no hay excesos. Fin. la capacidad de cada arista “cap[ ]”. Entradas: El número de vértices “vertice” y el número de aristas “aristas”. 3. NY ← 0. NW ← 0. 1. cantidad de flujo por cada arista “flujoarista[]”. vértice de inicio o fuente “fuente” y el vértice final. Solución de problemas de redes 1. A ← false. produciendo excesos en los vértices adyacentes a la fuente. Inicio. NQ ← 0. son regresados a la fuente. parm ← 0. NU ← 0. j ← 0 entrada ← 0. E ← false.

4. for (int i = 1. 10.0. 6. 1.Programa desarrollado Unidad 3.0.0. 7.0. 9.0}. 11.0. 10. int fuente = 1.0.0.0.0. public class Test extends Object{ public static void main(String args[]) { int vertice = 11. 6.out. for (int i = 1.0. System.out.0. 10.out. destino = 11. 8. 7. int cortemin[] = new int[vertice+1]. 8. 6.0. flujovertice). 10.0. int flujoarista[] = new int[aristas+aristas+1].0.cortemin. 10. 9. i <= vertice.0.flujovertice[i]).0.println("\nCantidad de flujo por cada una de las aristas:\n\n de hasta flujo").0.0. 7. 2.q. } Educación Abierta y a Distancia * Ciencias Exactas. 5. 3. 4. Maxflow.flujoarista[i]).0}.printf("%4d%7d\n".0.0}. i++) System. 3.0.0. int q[] = {0.FlujoMaxCorteMin(vertice. i++) if (cortemin[i] == 1) System. 6.0. la cantidad de datos esta dada por: 2*aristas+1 int p[] = {0.print("\nNOTA: En aquellas aristas que no aparecen.0.0. 2. 5. System.0.0. for (int i = 1. el flujo es cero (0)").0. Ingenierías y Tecnologías 38 38 .println("\n\nCantidad de flujo por cada uno de los vértices:" + "\n\n Vertice flujo").0.0.0.q[i]. 7.0.0.0.flujoarista. 8. aristas = 18.0. 2.p[i].0.printf("%2d%6d%7d\n". 3. i <= flujoarista[0].out.destino. 5.p.0. 5.0. 9. 11. int flujovertice[] = new int[vertice+1]. Redes Solución (Programa en Java): package maxflow. 8. 1.0.0.0. 14.q y cap.0.0.out.print("Vértices del corte mínimo: "). 1. 8. System. 3. int cap[] = {0.0. 8.aristas.fuente. i++) System.out. 12. 2. 10. System. 10.0. 12.out.0. 3.0.0. 3.cap.print(" " + i). 6. 4. 9. 3. //para p.0.0.0. 9. 1.0. i <= vertice.i.

NY = 1. for (i = 1. int p[]. G.Programa desarrollado Unidad 3. public class Maxflow { //valores de retorno public static void FlujoMaxCorteMin(int vertice. NQ = 0. if (j == fuente) flujo += cap[i]. C. B. int aristas. A = true. cont2 = 0. i <= vertice. salida = 0. i <= aristas. j = p[i]. F = false. for (i = 1. i++) primarista[i] = 0. i <= aristas. i++) { flujoarista[i] = 0. int mapeoi[] = new int[vertice+1]. mapeoi[i] = NY. int flujo. p[aristas+i] = q[i]. NP = 0. int fin = 0. NU = 0. int flujoarista[]. E = false. primarista[i] = NY. // Ordenamiento de aristas en orden lexicográfico etiqueta1: while (true) { aux = 0. int mapeoj[] = new int[vertice+1]. int q[]. i. int destino. cap[aristas+i] = 0. Redes } //////////////////////////////////////////////////////////////////////////////////////// package maxflow. int fuente. NW = 0. Ingenierías y Tecnologías 39 39 . } termino = false. int cap[]. aristas1 = 0. boolean D = false. cont1 = 0. NY += j. int flujovertice[]){ int primarista[] = new int[vertice+1]. NX = 0. int entrada = 0. B = false. boolean termino. int cortemin[]. i <= vertice. flujo = 0. NV = 0. primarista[j]++. // Inicialización for (i = 1. } aristas = aristas + aristas. j. q[aristas+i] = p[i]. } flujovertice[fuente] = flujo. i++) { j++. aux. i++) { j = primarista[i]. A. // Creación de aristas sustitutas j = aristas. NY. for (i = 1. etiqueta2: Educación Abierta y a Distancia * Ciencias Exactas. aristas2. parm = 0.

Ingenierías y Tecnologías 40 40 . cont2 = cont1. Educación Abierta y a Distancia * Ciencias Exactas. } } else { if (A) if (aux > 0) { if (aux <= 1) cont2 = cont1. } } else aux = 2. cont2 = cont1. NP = cont2 + cont2. aux = -1. aristas1--. NQ = cont2. cont2 = NP. aux = -1. cont1 = 1 + aristas / 2. } else { if (NY <= 0) { if (cont1 > 1) { cont1--.Programa desarrollado Unidad 3. Redes while (true) { if (!B) { if ((aux < 0) && A) { if (aux != -1) { if (NY < 0) NP++. } else { if (cont1 > 1) { cont1--. } if (aristas1 == 1) aux = 0. } if (A) { aristas1 = aristas. if (NP < aristas1) { NQ = NP + 1. aux = -2. } else { if (NP == aristas1) { NQ = cont2. } A = true. continue etiqueta2. A = false. cont1--. aux = 1. NQ = 1. A = false. else { NP = aristas1. cont2 = NP.

flujo = flujoarista[NP]. if (aux == 0) { C = true. flujoarista[NP] = flujoarista[NQ]. G = true. flujoarista[NQ] = flujo. } else { if ((aux > 0) || B) { // intercambio de dos aristas B = false. continue etiqueta2. cap[NQ] = flujo. aux = 1. p[j] = p[i]. } } else if (termino) { //Obtención del flujo máximo en cada arista j = 0. q[NP] = q[NQ]. if (NY == 0) NY = q[NP] . if ((aux < 0) && !B) { NY = p[NP] . for (i = 1.q[NQ]. else { NP = aristas1. p[NP] = p[NQ]. flujo = cap[NP]. C = false. q[NQ] = NY. i <= aristas.Programa desarrollado Unidad 3. NQ = 1. if (aux > 0) continue etiqueta2. Ingenierías y Tecnologías 41 41 . p[NQ] = NY. i++) if (flujoarista[i] > 0) { j++. Educación Abierta y a Distancia * Ciencias Exactas. } if (aristas1 == 1) aux = 0. aristas1--.p[NQ]. Redes cont2 = cont1. continue etiqueta2. NY = p[NP]. } } } } } G = false. NY = q[NP]. A = false. } else { mapeoj[NV] = NQ. cap[NP] = cap[NQ].

NV = q[fin]. aristas2 = mapeoj[NU] . while (true) { entrada++. i++) { NV = q[i]. if (fin > aristas2) break. i++) { if (i != fuente) flujovertice[i] = 0. mapeoi[salida] = NV. salida = 1. i++) cortemin[i] = -cortemin[i]. } cortemin[NV] = -1. if (entrada > salida) break. } } if (!G && !C) { //Realiza el cruce de referencias entre aristas for (i = 1. } entrada = 0. cortemin[fuente] = -1. flujo = cap[fin] . p[i] = mapeoi[NV]. mapeoi[1] = fuente. return. } } if (cortemin[destino] == 0) { // Salidas for (i = 1.1. Redes q[j] = q[i]. if ((cortemin[NV] != 0) || (flujo == 0)) continue. flujoarista[j] = flujoarista[i]. i <= vertice. NU = mapeoi[entrada].Programa desarrollado Unidad 3. if (i < vertice) mapeoj[i] = primarista[i + 1]. Educación Abierta y a Distancia * Ciencias Exactas. mapeoj[i] = aristas + 1. i <= aristas. } } etiqueta3: while (true) { if (!G) { if (!C) { aux = 0. while (true) { fin++. i <= vertice. if (NV != destino) { salida++. fin = primarista[NU] .flujoarista[fin]. mapeoi[NV]++. Ingenierías y Tecnologías 42 42 .1. for (i = 1. } flujoarista[0] = j. cortemin[i] = 0.

cap[NQ] -= flujoarista[NQ]. i++) { NU = q[p[i]]. } etiqueta4: while (true) { Educación Abierta y a Distancia * Ciencias Exactas. mapeoi[NW] = mapeoi[i]. i++) if (cortemin[mapeoi[i]] > 0) { NW++.Programa desarrollado Unidad 3. p[p[NQ]] = NP. termino = true. } while (true) { if (!C) { entrada--. i<=aristas. } flujovertice[fuente] = flujovertice[destino]. NQ = mapeoj[NU] . if (flujoarista[i] < 0) flujovertice[NU] -= flujoarista[i]. while (NP != NQ) { NV = q[NQ]. NU = mapeoi[entrada]. } break. for (i=1. } C = false. NP++. Redes for (i=1. } else { q[NQ] = -NV. B = true. i<=salida.1. continue etiqueta2. Ingenierías y Tecnologías 43 43 .1. if (NP < NQ) { p[p[NP]] = NQ. } NW = 0. } // Encuentra el flujo más factible aux = -1. if ((cortemin[NV] <= 0) ||(cap[NQ] == flujoarista[NQ])) { NQ--. } } if (NP >= primarista[NU]) cortemin[NU] = NP. NX = 1. if (entrada == 0) break. NP = primarista[NU] . } cortemin[destino] = 1. continue etiqueta1. p[i] = NU. flujoarista[NQ] = 0. continue.

fin = mapeoj[NU]. while (true) { if (fin == aristas2) { E = true. E = true. flujoarista[j] -= flujo. continue etiqueta4. do { j = p[fin]. flujovertice[NU] = -1. } j = p[fin]. if (NU < vertice) aristas2 = primarista[NU + 1]. } E = false. mapeoj[NU] = aristas2. continue etiqueta4. flujoarista[j] = 0. flujo = flujoarista[j]. flujovertice[NV] += flujo. fin++. NX--. } if (flujovertice[NU] == 0) { //Flujos acumulados aristas2 = aristas + 1. NV = q[fin]. continue etiqueta4. parm = 0. Ingenierías y Tecnologías 44 44 .Programa desarrollado Unidad 3. fin++. cap[j] -= flujo. if (NX != 1) { NU = mapeoi[NX]. if (NX <= NW) continue etiqueta4. } Educación Abierta y a Distancia * Ciencias Exactas. NX++. if ((flujovertice[NU] <= 0) || D || E) { if (!E) { D = false. } } if (primarista[NU] > cortemin[NU]) { fin = mapeoj[NU]. flujovertice[NU] -= flujo. } while (flujovertice[NU] > 0). flujoarista[fin] -= flujo. Redes if (!G) { if (!F) { if (!D && !E) NU = mapeoi[NX]. flujo = flujoarista[j]. if (flujovertice[NU] < flujo) flujo = flujovertice[NU]. if (flujovertice[NU] < 0) { E = true.

flujo = cap[fin] .flujoarista[fin]. if (flujovertice[NV] < 0) continue. fin--. p[p[NQ]] = NP. } for (i = 1. continue etiqueta4. } if (NP == NQ) mapeoj[NV] = NQ.1. if (NV >= 0) { q[i] = NV. } G = false. if (fin < primarista[NU]) break. flujovertice[NV] += flujo. NV = -q[fin]. Educación Abierta y a Distancia * Ciencias Exactas. Ingenierías y Tecnologías 45 45 .flujoarista[j]. } cortemin[NU] = fin. flujoarista[i] = flujo. if (flujovertice[NU] > 0) continue.Programa desarrollado Unidad 3. F = true. flujoarista[j] = -flujo. i <= aristas. B = true. flujoarista[fin] += flujo. if (NP < NQ) { p[p[NP]] = NQ. continue etiqueta2. i++) { NV = -q[i]. } // Se da el flujo máximo a la arista saliente del vertice fin = cortemin[NU] + 1. if (cap[fin] == flujoarista[fin]) fin--. flujo = flujoarista[i] . flujovertice[NU] -= flujo. Redes fin = cortemin[NU] + 1. } } while (true) { if (!G) { F = false. NP = p[fin]. parm = 1. if (flujovertice[NU] < flujo) flujo = flujovertice[NU]. cap[i] -= flujoarista[j]. break. if (parm != 0) { D = true. } } continue etiqueta3. NQ = mapeoj[NV] . j = p[i].

Redes continue etiqueta4.Programa desarrollado Unidad 3. flujovertice[NV] += flujo. flujovertice[NU] = -1. NV = q[fin]. } //Se eliminan los excesos de flujo entrantes de los vertices fin = mapeoj[NU]. continue etiqueta4. if (flujovertice[NU] < flujo) flujo = flujovertice[NU]. fin++. } while (flujovertice[NU] > 0). flujoarista[j] -= flujo. Ingenierías y Tecnologías Consola 46 46 . flujovertice[NU] -= flujo. flujo = flujoarista[j]. E = true. } } } } } } Resultado: Vértices del corte mínimo: 1 2 3 4 5 6 7 8 9 Cantidad de flujo por cada uno de los vértices: Vertice flujo 1 14 2 6 3 5 4 3 5 8 6 0 7 6 8 8 9 0 Educación Abierta y a Distancia * Ciencias Exactas. do { j = p[fin].

Paso 2. Inicialización de variables i ← 0. Conexidad lineal de una gráfica. Redes 10 11 6 14 Cantidad de flujo por cada una de las aristas: de 1 1 1 2 3 3 4 5 7 8 10 hasta flujo 2 6 3 5 4 3 5 6 5 2 7 3 7 3 8 8 10 6 11 8 11 6 NOTA: En aquellas aristas que no aparecen. Ingenierías y Tecnologías 47 47 . Entradas: El número de vértices “vertice” y el número de aristas “aristas”.Programa desarrollado Unidad 3. Salidas: La conexidad lineal “conex” de la gráfica. Conexidad Lineal Pseudocódigo: Paso 1. 1. el flujo es cero (0) 2. Inicio. j ← 0. 2. destino ← 0 cortemin[vertice+1] ← 0 aristai[4*aristas+1] ← 0 aristaj[4*aristas+1] ← 0 cap[4*aristas+1] ← 0 flujoaristas[4*aristas+1] ← 0 flujovertice[4*aristas+1] ← 0 conex ← vertice fuente ← 1 // Toma el vértice 1 como la fuente Educación Abierta y a Distancia * Ciencias Exactas. valores de la red: vértices de “p[ ]” a “q[ ]”.

4.2.fuente. 4.2.1.7.conex. Fin.1. int cortemin[] = new int[vertice+1].6.4.4. La conexidad lineal es igual al número mínimo de f(j) para j=2…vertice.aristas.3.6. int p[].j. int vertice = 7.Programa desarrollado Unidad 3. int aristai[] = new int[4*aristas+1].5.2. System.5.3. int flujoaristas[] = new int[4*aristas+1]. int q[] = {0.p. int flujovertice[] = new int[4*aristas+1]. conex = vertice. } } //////////////////////////////////////////////////////////////////////////////// package maxflow.7. for j=2… vertice Toma el vertice j como el destino Asigna una capacidad unitaria a todas las aristas para ambas direcciones Encuentra el valor del flujo máximo f(j) resultante en la gráfica end-for.6. int cap[] = new int[4*aristas+1].ConexidadLineal(vertice. Educación Abierta y a Distancia * Ciencias Exactas.4. Ejemplo: Solución (Programa en Java): package maxflow. Redes aristas2 ← aristas + aristas. int aristas = 12. int p[] = {0.q). 5. public class Conexidad { public static int ConexidadLineal(int vertice.aristas2.7.destino. 3. int q[]){ int i.3.2}. int aristas. Ingenierías y Tecnologías 48 48 .3. public class Prueba_ConexidadLineal extends Object{ public static void main(String args[]) { int conex.println("La conexidad lineal de la gráfica G es = " + conex).1}. int aristaj[] = new int[4*aristas+1].5.out. conex = Conexidad.

cap. i++) { j++.aristai.aristaj. for (i = 1. aristai[j] = p[i]. Descarga el documento llamado “Act. for (destino = 2. Análisis de conexidad Al finalizar esta actividad serás capaz de analizar gráficas para determinar su conexidad. Educación Abierta y a Distancia * Ciencias Exactas. if (flujovertice[fuente] < conex) conex = flujovertice[fuente]. Ingenierías y Tecnologías 49 49 . Instrucciones: resuelve cada uno de los problemas planteados de acuerdo a los lineamientos que se solicitan en cada uno de ellos. aristai[j] = q[i].aristas2. i <= aristas. 3. 1.flujovertice).FlujoMaxCorteMin(vertice.destino. destino <= vertice. 4. 3. cap[j] = 1.cortemin. aristaj[j] = p[i]. } } La conexidad lineal de la gráfica G es = 3 Consola Actividad 3. aristaj[j] = q[i]. Sustituye las XX por las dos primeras letras de tu primer nombre.fuente. Guarda tu documento con la siguiente nomenclatura MCOM1_U3_A3_XXYZ.fluj oaristas. aristas2 = aristas + aristas. Resuelve cada uno de los problemas que ahí se presentan. destino++) { // Construir la red for (i = 1. cap[j] = 1. j++. i++) { aristai[i] = 0. Análisis de conexidad” 2. cap[i] = 0. i <= 4*aristas. Envía tu documento a tu Facilitador(a) y espera su retroalimentación 5. aristaj[i] = 0.Programa desarrollado Unidad 3. } // Ducplicado de aristas j = 0. Redes fuente = 1. la Y por la inicial de tu apellido paterno y la Z por la inicial de tu apellido materno. } // Manda llamar el algoritmo de flujo máximo Maxflow. } return conex.

¡Sigue adelante!. Ingenierías y Tecnologías 50 50 . El método Ford y Fulkerson empieza considerando a) Un flujo máximo c) Todas las aristas llenas d) Cortes máximos b) Un flujo cero Para comparar tus respuestas. Tienes un conocimiento claro de los conceptos manejados en la Unidad. Educación Abierta y a Distancia * Ciencias Exactas. Los conocimientos obtenidos no fueron suficientes. se dice que la gráfica es b) Cíclica c) Conexa d) Ciclo a) Completa 3. El problema del flujo de una red consiste en a) Encontrar el flujo máximo para la red b) Encontrar el flujo mínimo para la red c) Encontrar la trayectoria de flujo más corta d) Encontrar la gráfica que representa a la red 4. ¿Cuál es la secuencia de vértices en la que cada par consecutivo está conectado? a) Arista 2. Redes Autoevaluación Es momento que realices la autoevaluación. Un conjunto de componentes conexos forma una gráfica a) Conexa b) Cíclica c) No dirigida d) Disconexa 5.Programa desarrollado Unidad 3. RETROALIMENTACION 1-3 aciertos. 4-5 aciertos. revisa el documento “Respuestas_autoevaluación_U3. b) Trayectoria c) Gráfica d) Red Si para cada par de vértices existe una trayectoria entre ellos. Instrucciones: elige la respuesta correcta que corresponda a la pregunta planteada. debes revisar nuevamente el contenido de la unidad. 1. ubicada en la pestaña material de apoyo. donde podrás medir el nivel de conocimiento adquirido durante la unidad.

Descarga el documento llamado “EA_Presentación de resultados” 2. Finalmente conociste el código ejecutable en una computadora de algoritmos relacionados con gráficas y flujo en redes. y requieren soluciones para sus problemas. atiende sus comentarios y reenvía la nueva versión de tu evidencia. Resuelve los problemas que se plantean en el documento descargable 3. métodos y algoritmos que te permiten analizar la conexidad de las gráficas. Ingenierías y Tecnologías 51 51 .html Educación Abierta y a Distancia * Ciencias Exactas. desde los circuitos eléctricos hasta las redes sociales. Consulta la Escala de Evaluación para conocer los criterios con que será evaluado tu trabajo. En esta unidad tuviste la oportunidad de aprender los fundamentos de las redes que te permiten analizarlas y proponer soluciones a sus problemas de flujo. Cierre de la Unidad Pudiste comprobar que las redes aparecen en casi cualquier área del quehacer humano. 4. Para saber más Consulta los siguientes links: Acerca de algoritmos de corte mínimo – flujo máximo: http://people. Espera la retroalimentación de tu Facilitador(a). Aprendiste conceptos. 5. programación de algoritmos para resolver problemas de redes Al finalizar esta actividad serás capaz de aplicar el teorema del corte mínimo – flujo máximo para encontrar el flujo máximo que puede fluir por una red y obtendrás una herramienta para determinar si dos matrices de adyacencia representan una misma gráfica.edu/~kirk/cs1501/animations/Network. Y envía tu archivo al Portafolio de Evidencias. la Y por la inicial de tu apellido paterno y la por la inicial de tu apellido materno. Guarda tu documento con la nomenclatura MCOM1_U3_EA_XXYZ.cs.Programa desarrollado Unidad 3. Recuerda sustituir las XX por las dos primeras de tu primer nombre. 1. teoremas y algoritmos para computadora alrededor de esta teoría que te ayudan a resolver problemas de las representaciones de las redes. Aprendiste conceptos. Comprobaste también que la teoría de gráficas aporta una plataforma para representar las redes en el ámbito matemático.pitt. en caso de que sea requerido. Redes Evidencia de Aprendizaje.

itesm. Selkow. Yellen. Karzanov. Journal of the Association for Computing Machinery. 15. Soviet Math. (2006). 434-437.. The MIT Press. 2nd Ed.yorku. J..ca/~aaw/Wang/MaxFlowStart. Massachusetts USA. Rivest.net/flows&multiflows.2.es/catalogo/mobile/curso. A.. Educación Abierta y a Distancia * Ciencias Exactas. C. (1974) Determining a Maximal Flow in a Network by the Method of Preflows.Programa desarrollado Unidad 3. No. A. (2009) O’Reilly Media. 1st Ed. Inc.cse. R. Chapman & Hall/CRC Press. Pollice. Graph Theory and Its Applications. redes y flujos: http://polimedia. Leiserson.pdf Acerca de representaciones. Vol.. Ingenierías y Tecnologías 52 52 .. (1988) A New Approach to the Maximum-Flow Problem. No. V. Redes http://www. T... J. Heineman. USA. C. Gross. G. 3rd Ed. Algorithms in a Nutshell. Cambridge. Dokl. Stein. G.mty. Tarjan. S. R.mx/tc1003/lecturas/tc1003-117.asp?curso=615b1ab8-bf46-294f-a53a-457977bfea87 Fuentes de consulta      Cormen.html) Goldberg. (http://alexander-karzanov.upv. 35. 4. (2009) Introduction to Algorithms.htm Acerca de flujo en redes de transporte: cb.. USA.