Вы находитесь на странице: 1из 44
CAPITULO 1 4 Algoritmos fundamentales con grafos CONTENIDO 14.1 14.2. 14.3. 14.4, 14.5. 14.6. 14.7. 14.8. Ordenacién topolégica. Matriz de caminos: algoritmo de Warshall. Problema de los caminos ms cortos con un solo origen: algoritmo de Dijkstra. Problema de los caminos més cortos entre todos los pares de nodos: algoritmo de Floyd. Problema del flujo de fluidos. Arbol de expansién de coste minimo. Problema del arbol de expansién de coste minimo: algoritmos de Prim y Kruskal. Codificacién del arbol de expansién de coste minimo. RESUMEN. EJERCICIOS. PROBLEMAS. Existen numerosos problemas que se pueden formular en términos de grafos. La resolucién de estos problemas requiere examinar todos los nodos 0 todas las aristas de un grafo; sin embargo, existen ocasiones en que la estructura del problema es tal que sdlo se necesitan visitar algunos de los nodos o bien algunas de las aristas. Los algoritmos im- ponen implicitamente un orden en estos recorridos: visitar el nodo mas proximo o las aristas més cortas, y asi sucesivamente; otros algoritmos no requieren ningun orden concreto en el recorrido, En base a lo anterior, se estudian en este capitulo el concepto de ordenacién topolégica, los problemas del camino mas corto, junto con el concepto de arbol de expansién de coste minimo. De igual modo se consideran algoritmos muy eficientes probado en situaciones criticas y de todo orden, tales como los algoritmos de Dijkstra, Warshall, Prim y Kruskal, entre otros. 455 464 Estructura de datos En el procedimiento podemos observar que el campo Alcanzado realmente no es necesario. Si algunos vértices no son alcanzables desde el vértice de partida el campo Distancia queda con el valor max int; ademés, una vez que un vértice es procesado no vuelve a entrar en la cola. Por consiguiente, podriamos suprimir el campo Alcan- zado aunque su mantenimiento nos permite un més facil seguimiento del algoritmo y posterior proceso de la tabla T. Examinando el algoritmo podemos estimar que el tiempo de ejecucién es O(n) del bucle para meter en cola los vértices adyacentes, como el bucle se ejecuta un maximo de n veces, por lo que podemos estimar que el tiempo total es O(n2). Si el nimero de arcos a fuera mucho menor que ny representando los arcos mediantes listas de adya- cencia el tiempo de realizacién del procedimiento seria O(a + n), siendo a el mimero de arcos. Algoritmo del camino mds corto: algoritmo de Dijkstra ‘Tenemos un grafo dirigido G = (V,A) valorado y con factores de peso no negativos, uno de los algoritmos mas sencillos y eficientes para determinar el camino més corto des- de un vértice al resto de los vértices del grafo es el algoritmo de Dijkstra. Este algorit- ‘mo ¢s un tipico ejemplo de algoritmo avido, que resuelven los problemas en sucesivos pasos, seleccionando en cada paso la solucién mas éptima en aras de resolver el problema. Recordamos que al ser un grafo valorado cada arco (v},¥)) tiene asociado un cos- kt W408 F cir te cy 2 0. De tal forma que el coste de un camino y= V2 El algoritmo de Dijkstra en cada paso selecciona un vértice v cuya distancia es des- conocida, entre los que tiene la distancia mas corta al vértice origen s, entonces el cami= no mas corto de s a v ya es conocido y marca el vértice v como ya conocido. Asi, suce- sivamente va marcando vértices hasta que de todos los vértices es conocida la distancia minima al origen s Veamos con mis detalle como realizar esta estrategia. En un conjunto F tenemos los vértices cuya distancia mas corta respecto al origen es ya conocida. En el vector D se almacena la distancia mas corta (coste minimo) desde el origen a cada vértice del grafo. Inicialmente, F contiene tinicamente el origen s y los elementos de D, D, ,el coste de los arcos (v,,v)); si no hay arco de s a i suponemos el coste «. En cada paso se agrega algun vértice v de los que todavia no estén en F, es decir, de V — F, que tenga el menor valor D(v); ademas se actualizan los valores D(w) para los vértices w que todavia no estén en F: D(w) = minimo [D(w), D(v) + ¢,.]- De esta manera ya conocemos que hay un camino de sa v cuyo coste minimo es D(v). Para reconstruir el camino de coste minimo que nos lleva de s a cada vértice v del grafo se almacena para cada vértice el ultimo vértice que hizo el coste minimo. Entonces asociado con cada vértice tenemos dos campos, la distancia 0 coste mini- mo y el tiltimo vértice que hizo el camino més corto; esto nos Heva a definir un re- gistro con esos dos estados y una tabla (como ya hicimos en el problema de longitud de camino). Aigoritmos fundamentales con grafos 465 En la figura del ejemplo 14.2 tenemos un grafo dirigido valorado y queremos calcu- lar el coste minimo desde el vértice | al resto de los vértices siguiendo el algoritmo de Dijkstra. EJEMPLO 14.2 Se tiene el grafo valorado dirigido: La matriz de adyacencia con los pesos de los arcos y considerando el peso como 2 cuando no hay arco: aeegse 88a 88S N48 888 8 5 a Feees sd 88 88 8 Los valores que se van obteniendo en los sucesivos pasos estan representados en forma tabular: Paso F w DI] DIS) Dis} Dist Dis) Inicial 1 3 4 - 8 - 1 2 3 4 - 8 ° 2 3 3 4 = 7 3 5 3 4 4 7 10 4 1,2,3,5,6 6 3 4 12 Zz 10 5 123,564 4 3 4 12 7 10 Asi por ejemplo, el camino minimo de V a V, es 10 y la secuencia de vértices que hacen el camino minimo: V; - V3 — Vs ~ Ve. 466 = Estructura de datos CODIFICACION En la codificacién se supone que el vértice origen es el de indice 1. Ademas se tiene como entrada la matriz de pesos la cual contiene el coste de cada arco, de no haber arco contiene maxint; {representa el 2}. const N= 15; { ndmero de vértices } type {tipos para representar los vértices y matriz de adyacencia = matriz de pesos) Matadcias array[Indicevert,Indicevert] of integer; Estado-recora Distancia: integer; {Suponemos que el factor de peso es entero) Ultimo: Vertice end; Tablas array[1..N] of Estado; procedure Dijkstra(var T:Tabla; C:Matadcia); {C la matriz de pesos = A matriz de adyacencia) type ConjVert= eet of 1. var Z,V,W: IndiceVert;(1..N) Todos, F: Conjvert: procedure Inicial(var f:Tabla); var v: integer: begin for v:= 2 to N do with Tiv] do begin Distanci. function Minimo (?:Tabla;R:ConjVert) :IndiceVert; var J,V: Indicevert; Mx: integer; begin Mx:= maxint; for J:= 2 to N do 4f (3 in R) and (Mx > T(J).Distancia) then begin a Mx: end; Minimo:=V end; begin Fre [1]; (vértice origen) Todos:=(1..N]; Inicial (7); [a] Distancia Algoritmos fundamentales con gratos 467 an tor begin (Busqueda del vértice de menor distancia} W:= Minimo (T,Todos-F); Fis F+W) (Se actualizan las Distancias para los vértices restantes} for v:=2 to N do if Vin (Todos-P) then with T[V] do Af (T(W].Distancia+ C{W,V]}< Distancia) then pasos para seleccionar los N-1 vértices} 1 to N-1 do begin Distancia:= T{w].Distancia+ C{W,V]): Ultimo ena end end; En cuanto al tiempo de ejecucién del algoritmo, enseguida deducimos que leva un tiempo de O(x?) debido a los dos bucles anidados de orden n. Ahora bien en el caso de que el nimero de arcos @ fuera mucho menor que n? puede mejorarse su ejecucion representando el grafo con listas de adyacencia y organizando los vértices no integrados en F (Todos-F) con una cola (como en el algoritmo de Longitud de camino), entonces puede obtenerse un tiempo de O(a log n). 14.4. PROBLEMA DE LOS CAMINOS MAS CORTOS ENTRE TODOS LOS PARES DE VERTICES: ALGORITMO DE FLOYD En algunas aplicaciones puede resultar interesante determinar el camino minimo entre todos los pares de vertices de un grafo dirigido valorado. El problema podria resolverse por medio del algoritmo de Dijkstra, aplicandolo a cada uno de los vértices, pero hay otra alternativa que es mas directa y es mediante el algoritmo de Floyd. Sea G un grafo dirigido valorado, G = (V,A). Suponemos que los vértices estén numera- dos de 1a N; la matriz de adyacencia A en este caso es la matriz de pesos, de tal forma que todo arco (v;,v,) tiene asociado un peso cy; si no existe arco (v,v,) suponemos que ¢,= ©. Cada elemento de la diagonal se hace 0. Ahora se quiere encontrar la matriz D de N,N elementos tal que cada elemento Dj sea el coste minimo de los caminos de (v,.¥). El proceso que sigue el algoritmo de Floyd tiene los mismos pasos que el algoritmo de Warshall para encontrar la matriz de caminos, Se genera iterativamente la secuencia de matrices Dg, Di, Ds, .... Di, -« Dy cuyos elementos tienen el significado: ¥ Dylij] = ¢ coste (peso) del arco de fa j. e sino hay arco. 468 — Estructura de datos D,fi,j] = minimo (D,fi,/], Defi, 1] + Dol /,/]). Es decir, el menor de los costes entre el anterior camino de i — j y la suma de los costes de caminos de i — 1, Ij. D,{ij] = minimo (D,[i,/], D\[i,2]+ D,[2,j]). Es decir, el menor de los costes entre el anterior camino de i > j y la suma de los costes de caminos de i 2, 23). En cada paso se incorpora un nuevo vértice para ver si hace el camino minimo entre un par de vértices. = minimo (D[iJ], Deal. + Dy a[k,j)). Es decir, el menor de los costes entre el anterior camino de i — j y la suma de los costes de caminos de imkkoj. De esta forma hasta llegar a la matriz D, que sera la matriz de caminos minimos del grafo. EJEMPLO 14.3 En la figura siguiente se tiene un grafo dirigido con factor de peso; aplicando los sucesi- vos pasos del algoritmo de Floyd se llega a la matriz de caminos minimos. La matriz de pesos: 1 0 2 a BaLgBO a) wog ang onang Las sucesivas matrices D,, D,, ... Ds que es la matriz de caminos minimos: 0 1 © © a 0 0 4 7 . cae . 3.2 0 o 4] Alincorporar el vértice 1 ha cambiado D; (4,2) ya que et oe oil CG cl) < ca): co co co 3 Q, Ole 5 8 © 0 © 4 7] Alincorporar el vértice 2 ha habido varios cambios. 3.2 0 6 4] Asiha ocurrido con D,(1,4): 67 2 0 2 wo 0 © 3 0, D,(1,2) + D,(2,4) < D, (1,4) Algoritmos fundamentales con grafos 469 Al incorporar el vértice 3 no ha habido cambios; al vértice 3 no llega ningun arco. Zavgo gruneo- ees ee woanu onare As se seguiria para determinar Dy y Ds, Al igual que se ha hecho en el algoritmo de Dijkstra por cada vértice se desea guar~ dar el indice del tiltimo vértice que ha conseguido que el camino sea minimo del v; a v,, en caso de que el camino sea directo tiene un cero. Para ello se utiliza una matriz de vértices. CODIFICACION 15; (mimero de vértices} type {tips para representar los vértices y matriz de adyacencia = matriz pesos} Matadcia - array{Indicevert,Indicevert! of integer; MatCmo= array(Indicevert, Indicevert} of 0..%; procedure © i,d.k: integer; ya(C: Matadcia; var D: Matadcia; var Tr: MatCmo); begin for i:= 1 ton do for j:= 1 ton do begin Dis, a) al snimo de un vertice a s{ mismo se considera cero i ton do (D(A, k] +DEk, jl P 0 then begin Camino (vi, Vk )+ write(Vk," 5 Camino (Vk, V3} end end; 14.5. CONCEPTO DEL FLUJO La primera idea de flujo se obtiene del significado popular: forma de enviar objetos de un lugar a otro. Ejemplos de la vida diaria: entre los centros de produccién y los centros de distribu- cidn hay un flujo de mercancias. Entre los lugares de residencia y los centros de trabajo se produce un flujo de personas. Un sistema de tuberias para transporte de agua, cada arco es un tubo y el «peso» representa la capacidad de la tuberia en Litros/Minuto y los nodos son puntos de unin de los diversos tubos. Esta es la idea intuitiva de flujo, ahora exponemos la formulacién matemética de flujo: Se llama flujo a una funcién Fij definida en A (arcos) que verifica las propiedades: Fy 20 Vii. eA 2. EFi-EAi=0 ie VieSieT @,= conjunto vértices conectados con el vértice i mediante arcos que salen de i B; = conjunto vértices conectados con el vértice i mediante arcos que entran en i. V es el conjunto de nodos. S es el nodo inicial del flujo. T es el nodo destino del flujo. 3. Fij $ Uij Wie A Siendo Ui/ la capacidad del arco i. La segunda condicién impone la conservacién de la cantidad total de flujo (ley de Kirchoff). Las condiciones primera y tercera imponen la cota superior ¢ inferior de los valores del flujo. Algoritmos fundamentales con grafos. 471 14.5.1. Planteamiento del problema Sobre una red de flujos pueden plantearse diversos problemas. Asi se puede desear maxi- mizar la cantidad transportada desde un vértice origen a un vértice destino. Otro proble- ma tipico es conocer el modo mas econémico de enviar una determinada cantidad de objetos desde un origen a un destino en un sistema de distribuci6n. Por consiguiente, un grafo con factor de peso, una red de flujo es una estructura ideal para modelar estas situaciones. EJEMPLO 14.4 Planificacién de rutas alternativas para circulacién en horas punta. Supéngase un punto de origen con fuerte trafico, por ejemplo una ciudad dormitorio, y otfo punto que representa el centro, zona comercial, de la gran ciudad. Entre ambos puntos se pueden establecer diversas rutas de entrada, cada una de ellas con una capaci- dad de trafico maxima, dato que es conocido y expresado en miles de vehiculos por hora. Un problema que se puede plantear es encontrar cual es el flujo maximo de vehicu- los que pueden desplazarse desde el punto origen al destino en la hora punta, y conocer cual sera el indice de utilizacién de cada una de las rutas de entrada. Esto nos conduce a un problema de optimizacién. EJEMPLO 14.5 Consideremos un sistema de tuberias de transporte de agua; cada arco representa un tubo y el factor de peso es la capacidad en litros/minuto. Los vertices representan puntos en los cuales las tuberias estan unidas y el agua es transportada de un tubo a otro. Dos nodos, $ y T, representan la fuente de emisién del agua y el punto de consumo, respectivamente. Se desea maximizar la cantidad de agua que fluye desde el vértice fuente hasta su punto de consumo. 472 Estructura de datos Red de flujos Los pesos representan la capacidad de cada tuberia en litros/minutos. 14.5.2. Formulaci6n matematica Sea la red G = (V, A) con un tinico vértice $ fuente y un Unico sumidero T, donde aso- ciado a cada arco (i, ) hay un nimero Uij que representa la capacidad maxima del arco. ZFS, X) = Vf =ZF(X, T) la cantidad de «agua», «trifico» ... que sale del vértice § es igual a la cantidad que entra en el sumidero T, y esta cantidad es VE. EI problema del flujo maximo consiste en enviar la mayor cantidad posible de flujo desde el vértice fuente S al vértice sumidero T. Matematicamente, maximizar Sit sujeto a las condiciones (flujo que entra = flujo que sale): Sf, - Sf, = i#S,i4T OSFii SU fi, jpeA La funcién objetivo es la suma de los flujos que legan al vértice sumidero. Es preci- samente la cantidad que se desea hacer maxima. Esta funcién de flujo se denomina ef éptimo. 14.5.3. Algoritmo del aumento del flujo: algoritmo de Ford y Fulkerson Este es uno de los algoritmos mas sencillos y a la vez eficientes para determinar el flujo maximo en una red, partiendo de un nodo fuente $ y teniendo como destino el nodo sumidero T. Algoritmos fundamentales con gratos. 473 La idea bisica de algoritmo es partir de una funcién de flujo, flujo cero, ¢ iterativa- mente ir mejorando el flujo. La mejora se da en la medida que el flujo de $ hasta T aumenta, teniendo en cuenta las condiciones que ha de cumplir la funcién de flujo en lenguaje natural * Flujo que entra a un nodo ha de ser igual al flujo que sale. * En todo momento el flujo no puede superar la capacidad del arco. Los arcos de la red pueden clasificarse en tres categorias: * No modificable: arcos cuyo flujo no puede aumentarse ni disminuirse, por tener capacidad cero o tener un coste prohibitivo. * Incrementable: arcos cuyo flujo puede aumentarse, transportan un flujo inferior a su capacidad. * Reducible: arcos cuyo flujo puede set reducido, Con estas categorias podemos establecer las siguientes mejoras de la funcién de flu- jo desde S aT: 1." Forma de mejora: encontrar un camino P del vértice fuente S al sumidero T tal que el flujo a través de cada arco del camino (todos los arcos incrementables) no supera a la capacidad F(ViV)) SUij Vii, j) e P Entonces el flujo se puede mejorar en las unidades Minimo {(Ui,j — Fij), Vi, j) © P} 2° Forma de mejora: encontrar un camino P' del sumidero T a la fuente S formado por arcos reducibles, entonces es posible reducir el flujo de T a $ y por tanto aumentar en las mismas unidades de flujo de $ a T en la cantidad: Minimo {Fij, V(i, j) € P*} 3.4 Forma de mejora: existe un camino P1 desde S hasta algin nodo V con los arcos incrementables, un camino P2 desde un nodo W hasta el sumidero T con arcos inerementables, y un camino P3 desde W a V con flujo reducible. Entonces el flujo a lo largo del camino W — V puede ser reducido y el flujo desde $ a T puede ser incrementado en las unidades de flujo igual al minimo de estas dos cantidades: Minimo {(Uij ~ Fij), — W(i, j) € PI, 0 bien, € P2} Minimo {Fij, Wi, j) © P3} Este minimo se llama aumento de flujo maximo de la cadena. Acaba de aparecer en este contexto de redes el concepto de cadena, conviene que establezcamos una definicién. 456 Estructura de datos 14.1. ORDENACION TOPOLOGICA Un grafo G dirigido y sin ciclos se denomina un gda (grafo dirigido aciclico) 0 grafo aciclico. Los gda son utiles para la representacién de estructuras sintacticas de expresio- nes aritméticas. Los grafos dirigidos aciclicos también son itiles para la representacion de ordenaciones parciales. Una ordenacién parcial R en un conjunto C es una relacién binaria de precedencia tal que: Para todo w perteneciente a C, u no est relacionado con u, w Rw es falso, por tanto, la relacién R es no reflexiva. 2. Para todo u, v, we C,siu R vy v Rw entonces w Rw. La relacién R es tran- sitiva, Tal relacién R sobre C se llama ordenacién parcial de C. Un ejemplo inmediato es la relacién de inclusién en conjuntos. Un grafo G sin ciclos se puede considerar un conjunto parcialmente ordenado. Para probar que un grafo es aciclico puede utilizarse la biisqueda en profundidad, de tal for- ma que si se encuentra un arco de retroceso en el arbol de bisqueda el grafo tiene al menos un ciclo. Una ordenacién topolégica T de un grafo aciclico es una ordenacién lineal de los vértices, tal que si hay un camino del vértice v, al vértice v,, entonces v, aparece después de v, en la ordenacién T. EJEMPLO 14.1 e+ La figura muestra un grafo aciclico que representa la estructura de prerrequisitos de ocho cursos. Un arco cualquiera (r, s) significa que el curso r debe de terminarse antes de empezar el curso s. Por ejemplo, el curso M21 se puede empezar solo cuando termi- nen los cursos E11 y T12; se dice que Ell y T12 son prerrequisitos de M21 Una ordenacién topoldgica de estos cursos es cualquier secuencia de cursos que cumple los requerimientos (prerrequisitos). Entonces para un grafo dirigido aciclico no tiene por qué existir una tinica ordenacién topoldgica. Del grafo de requisitos de la figura obtenemos estas ordenaciones topoldgicas: Ell - T12 - M21 - C22 - R23 - $31 - $32 - T41 T12 - Ell - R23 - C22 - M21 - S31 - $32 - T41 474 Estructura de datos Una cadena que une los vértices Vi, Vj es una sucesién de arcos con origen enel vértice i y final en el vértice j, tal que dos arcos sucesivos tienen un vértice comin, aunque no necesariamente el vértice final de un arco es el inicial del siguiente. De manera mas escueta, una cadena, también Iamada semicamino, desde Va Wes la secuencia de nodos V = X,,Xs,.--,X, = Wtal que para todo i, 1<=i<=n se cumple que (X,.;,X,) 0 (X,,X, 3) es unarco. De inmediato podemos afirmar que todo camino P de V a W es una cadena, aunque no toda cadena es un camino. En el grafo de la figura siguiente encontra- mos que una cadena de S a T es: D- 7 A cualquier cadena de la red de S a T a la que se le pueda aplicar una de las formas de mejora de flujo sera una cadena de aumento de flujo. El objetivo que persigue el algoritmo de aumento de flujo es encontrar cadenas de aumento de flujo en la red y aumentar el flujo en la cantidad determinada en los tres modos expuestos. La solucién éptima se encuentra cuando ya no hay més cadenas de aumento de flujo. 14.5.4. Ejemplo de mejora de flujo Considérese de nuevo la red de tuberias los pesos de los arcos representan las capacidades en litros/minuto. Existen los caminos P1 S~A-C-T, P2 S-B-D-T y P3_ S-A-D-T con arcos in- crementables, Por el camino P1 el flujo puede ser mejorado en 3 unidades, por el cam no P2 el flujo es mejorable en dos unidades. Una vez realizadas estas mejoras la funcién de flujo queda: Aigoritmos fundamemtates con grafos 475 Ahora en los arcos se ha representado la capacidad y el flujo actual. Atin puede ha- cerse otra mejora por el camino P3 en I unidad. La funcién flujo quedaré: Como se observa de la fuente $ salen 6 unidades de flujo que son las que Ilegan al sumidero T. Para que sirva de ejemplo de mejora de flujo por aumento de cadena, sea el siguiente grafo en el que representamos la capacidad de cada arco: x 4 5 4 4 . Ahora si el flujo de ¥ a X es reducido, aumentando en las mismas unidades el de S a y, el flujo de entrada de x a T aumenta en dicha cantidad. Ha habido un aumento neto del flujo de S a T. Expeséndolo en términos de cadena: hay un camino de $ a ¥ con arcos incrementables (4-0), un camino de X a ¥ con arcos reducibles (4) y un camino de X a P con arcos incrementables (3-0); en definitiva, la cadena $ - Y - X - T.EI aumento de flujo por la cadena es el valor minimo entre arcos incrementables y reduci- bles, que en este caso es 3 unidades. La funcién de flujo: 476 Estructura de datos 43 a4 14.5.5. Esquema del algoritmo de aumento de flujo Los pasos que sigue el algoritmo de aumento de flujo: 1. Parte de un flujo inicial, F,, = 0. Determina arcos que son incrementables y los que son reducibles. Marca el vértice fuente S. 2. Repetir hasta que sea marcado el vértice sumidero T, o bien no sea posible mar- car mas vértice: 2.1, Si un vértice i esta marcado, existe el arco (i,j) y es tal que (i,j) es arco incrementable, entonces marcar vértice j. 2.2. Siun vértice i est marcado, existe el arco (j,i) yes tal que (j,i) es un arco reducible, entonces marcar el vértice j. 3. Siha sido marcado el vértice sumidero T, hemos obtenido una cadena de aumen- to de flujo. Aumentar el flujo al méximo aumento de flujo permitido por la cade- na. Actualizar los flujos de cada arco con las unidades de aumento. Borrar todas las marcas, salvo la del vértice S, y repetir a partir del paso 2. 4, Sino ha sido marcado el vértice 7, finalizar la aplicacién del algoritmo; no es posible enviar ms flujo desde S hata T. EJEMPLO 14.6 Dada la siguiente red, en la que los pesos de los arcos representan la capacidad y el Flujo actual, se aplican los pasos que propone el algoritmo de Ford-Fulckenson para encontrar el flujo maximo. 30 x" ew. 40 5,0 5.0 60 6.0 Z—___p»y~ 6 40 En una primera pasada se marcan los vértices S, X, Y, T; todos los arcos son incrementables, se tiene una cadena de aumento de flujo. El incremento de flu- Algoritmos fundamentales con grafos 477 jo=Min{(Cij- Fij) para todo arco de la cadena}, en esta cadena es 4, Ahora se actualizan los flujos de cada arco con el valor 4. > w 50 64 Z—,—>" En una segunda pasada se marcan los vertices S, 2, ¥, ‘Ts todos los arcos son incre- mentables, se tiene una segunda cadena de aumento de flujo. El incremento de flu- jo=Min{(Cij- Fij) para todo arco de la cadena}, en esta cadena es 2, Se actualiza los flujos: 5.0 66 En una tercera pasada se marcan los vértices 5, Z, Y, X, W, T3 los arcos (S, 2), (Z, Y) sonincrementables, el arco (X, Y) es reducible y los arcos (X, W), (W, ‘T) son incrementables; se tiene una tercera cadena de aumento de flujo. El incremento de flujo de la cadena es 2. Se actualizan los flujos: <=> w. 44 52 52 6s 6a +" aa En esta red ya no es posible encontrar mas cadenas de aumento de flujo. Por tanto, el flujo maximo que llega a T es 4 + 4 = 8; su solucién esté representada en Ia figura 478 Estructura de datos El anilisis de la solucién proporciona informacién muy valiosa para valorar en qué arcos conviene aumentar la capacidad para que aumente més el flujo que llega a 7. 14.5.6. Tipos de datos y pseudocédigo Los procesos indicados anteriormente para encontrar el flujo méximo se detallan a con- tinuacién: inicio Inicializar la funcién de flujo a cero en cada arco Nocadena « false repetir si entonces Nocadena ¢ true ino fined hasta Nocadena fin Los tipos de datos son aquellos necesarios para representar las acciones indicadas en el algoritmo. Para «marcar» un nodo, una vez que éste ha sido colocado en una cadena, utilizamos el vector boolean Encadena, de tal forma que Encadena (nodo} indica si el nodo est en la cadena que se est formando o no. En el vector boolean Finvia un elemento Finvia[nodo] indica si el nodo esta al final de la cadena que se est formando. Para obtener correctamente la secuencia de nodos que forman la cadena, el vector Precede es tal que Precede [nodo] referencia al nodo precedente del nodo indice en la cadena de la que forma parte. El vector boolean Adelante es tal que Adela te[nodo] es true si el arco es hacia adelante, hacia T; en definitiva, el arco (prece- de{nodo], nodo). Las unidades de flujo acumuladas hasta un nodo se guardan en la posicién corres- pondiente del vector Flujos. La capacidad de un arco y su flujo actual se almacenan respectivamente en las posi- ciones correspondientes de las matrices C, F: C(i,j] yFli,j]. Ahora se pueden expresar con un poco mas de detalle el algoritmo de aumento de flujo: Iniedo Para todos los nodos: Finvia(nodo]e false Encadena(nodo]@ false {S, T son los nodos origen y sumidero} Finvia[sie true Encadena[Si@ true Fin_para mientras (no Encadena(?]) y (exista nd,,Finvia(nd]) hacer Finvia(nd) © false

Вам также может понравиться