Vous êtes sur la page 1sur 34

Nociones Bsicas Sobre Grafos

Grafo: Un grafo, G, es un par ordenado de V y A, donde V es el conjunto de vrtices


o nodos del grafo y A es un conjunto de pares de vrtices, a estos tambin se les
llama arcos o ejes del grafo. Un vrtice puede tener cero o ms aristas, pero toda
arista debe unir exactamente a dos vrtices.
Los grafos representan conjuntos de objetos que no tienen restriccin de relacin
entre ellos. Un grafo puede representar varias cosas de la realidad cotidiana, tales
como mapas de carreteras, vas frreas, circuitos elctricos, etc.
La notacin G = (V, A) se utiliza comnmente para identificar un grafo.
Arista: Son las lneas con las que se unen los nodos de un grafo y con la que se
construyen tambin caminos.
Si la arista carece de direccin se denota indistintamente {a, b} o {b, a}, siendo a y b
los vrtices que une.
Si {a ,b} es una arista, a los vrtices a y b se les llama sus extremos.
o Aristas Adyacentes: Se dice que dos aristas son adyacentes si convergen en el
mismo vrtice.
o Aristas Paralelas: Se dice que dos aristas son paralelas si el vrtice inicial y el
final son el mismo.
o Aristas Cclicas: Arista que parte de un vrtice para entrar en el mismo.
Vrtice: Son los puntos o nodos con los que esta conformado un grafo.
Llamaremos grado de un vrtice al nmero de aristas de las que es extremo. Se dice
que un vrtice es par o impar segn lo sea su grado.
o Vrtices Adyacentes: Si tenemos un par de vrtices de un grafo (U, V) y si
tenemos una arista que los une, entonces U y V son vrtices adyacentes y se dice
que U es el vrtice inicial y V el vrtice adyacente.
o Vrtice Aislado: Es un vrtice de grado cero.
o Vrtice Terminal: Es un vrtice de grado 1.
Caminos: Sean x, y vrtices de un grafo G, se dice que hay un camino en G de x a y
si existe una sucesin finita no vaca de aristas {x , v1},{v1 , v2},...,{vn , y}. En este
caso :
o x e y se llaman los extremos del camino.
o El nmero de aristas del camino se llama la longitud del camino.
o Si los vrtices no se repiten el camino se dice propio o simple.
o Si hay un camino no simple entre dos vrtices, tambin habr un camino simple
entre ellos.
o Cuando los dos extremos de un camino son iguales, el camino se llama circuito o
camino cerrado.
o Llamaremos ciclo a un circuito simple.
o Un vrtice a se dice accesible desde el vrtice b si existe un camino entre ellos.
Todo vrtice es accesible respecto a si mismo.
Clasificacin de grafos: Podemos clasificar los grafos en dos grupos: dirigidos y no
dirigidos. En un grafo no dirigido el par de vrtices que representa un arco no est
ordenado. Por lo tanto, los pares (v1, v2) y (v2, v1) representan el mismo arco. En un
grafo dirigido cada arco est representado por un par ordenado de vrtices, de forma
que los pares (v1, v2) y (v2, v1) representan dos arcos diferentes.

Grafo no dirigido

Grafo dirigido

Grafo regular: Aquel con el mismo grado en todos los vrtices. Si ese grado es k lo
llamaremos k-regular. Por ejemplo, el primero de los siguientes grafos es 3-regular,
el segundo es 2-regular y el tercero no es regular:

Grafo completo: Aquel con una arista entre cada par de vrtices. Un grafo completo
con n vrtices se denota Kn. A continuacin pueden verse los dibujos de K3, K4, K5
y K6:

Grafo nulo: Se dice que un grafo es nulo cuando los vrtices que lo componen no
estn conectados, esto es, que son vrtices aislados:

Grafo euleriano: Para definir un grafo euleriano es importante definir un camino


euleriano primero. Un camino euleriano se define de la manera ms sencilla como
un camino que contiene todos los arcos del grafo, apareciendo cada uno de ellos
exactamente una vez.
Teniendo esto definido podemos hablar de los grafos eulerianos describindolos
simplemente como aquel grafo que contiene un camino euleriano.
Grafo conexo: Un grafo se puede definir como conexo si cualquier vrtice V
pertenece al conjunto de vrtices y es alcanzable por algn otro. Otra definicin que
dejara esto ms claro sera: un grafo conexo es un grafo no dirigido de modo que
para cualquier par de nodos existe al menos un camino que los une. Por ejemplo:

Recorrido de un grafo: Recorrer un grafo significa tratar de alcanzar todos los


nodos que estn relacionados con uno que llamaremos nodo de salida. Existen
bsicamente dos tcnicas para recorrer un grafo: el recorrido en anchura; y el
recorrido en profundidad.
o Recorrido en anchura: El recorrido en anchura supone recorrer el grafo, a partir
de un nodo dado, en niveles, es decir, primero los que estn a una distancia de un
arco del nodo de salida, despus los que estn a dos arcos de distancia, y as
sucesivamente hasta alcanzar todos los nodos a los que se pudiese llegar desde el
nodo salida.
o Recorrido en profundidad: el recorrido en profundidad trata de buscar los
caminos que parten desde el nodo de salida hasta que ya no es posible avanzar
ms. Cuando ya no puede avanzarse ms sobre el camino elegido, se vuelve atrs
en busca de caminos alternativos, que no se estudiaron previamente.

rbol de Mnima Expansin - Algoritmo de Kruskal y


algoritmo de Prim
rbol: Es un grafo en el que existe un nico nodo desde el que se puede acceder a
todos los dems y cada nodo tiene un nico predecesor, excepto el primero, que no
tiene ninguno. Tambin podemos definir un rbol como:
o Un grafo conexo y sin ciclos.
o Un grafo sin ciclos y con n-1 aristas, siendo n el nmero de vrtices.

Grado de un nodo en un rbol es el nmero de subrboles de aquel nodo (en el


ejemplo, el grado de v1 es 2 y de v2 1).
Denominamos hojas en un rbol a los nodos finales (v3, v5 y v6).
Un rbol de mximo alcance es aquel que obtenemos en un grafo conexo y sin
ciclos.
rbol de mnima expansin: rbol de mximo alcance cuyo valor es mnimo, es
decir, la suma de sus aristas es mnima.
ALGORITMO DE KRUSKAL: El algoritmo de Kruskal permite hallar el rbol
minimal de cualquier grafo valorado (con capacidades). Hay que seguir los
siguientes pasos:
1. Se marca la arista con menor valor. Si hay ms de una, se elige cualquiera de ellas.
2. De las aristas restantes, se marca la que tenga menor valor, si hay ms de una, se
elige cualquiera de ellas.
3. Repetir el paso 2 siempre que la arista elegida no forme un ciclo con las ya
marcadas.
4. El proceso termina cuando tenemos todos los nodos del grafo en alguna de las
aristas marcadas, es decir, cuando tenemos marcados n-1 arcos, siendo n el
nmero de nodos del grafo.
Ejemplo: Determinar el rbol de mnima expansin para el siguiente grafo:

Siguiendo el algoritmo de Kruskal, tenemos:


o Elegimos, por ejemplo, la arista (5, 6) = 1 (menor valor) y la marcamos.

o Elegimos la siguiente arista con menor valor (1, 3) = 1 y la marcamos.


o Elegimos la siguiente arista con menor valor (5, 7) = 2 y la marcamos, ya que no
forma ciclos con ninguna arista de las marcadas anteriormente.
o Elegimos la siguiente arista con menor valor (1, 2) = 3 y la marcamos, ya que no
forma ciclos con ninguna arista de las marcadas anteriormente.
o Elegimos la siguiente arista con menor valor (6, 7) = 4 y la desechamos, ya que
forma ciclos con las aristas (5, 7) y (5, 6) marcadas anteriormente.
o Elegimos la siguiente arista con menor valor (2, 5) = 5 y la marcamos, ya que no
forma ciclos con ninguna arista de las marcadas anteriormente.
o Elegimos la siguiente arista con menor valor (4, 5) = 6 y la marcamos, ya que no
forma ciclos con ninguna arista de las marcadas anteriormente.
o FIN. Finalizamos dado que los 7 nodos del grafo estn en alguna de las aristas, o
tambin ya que tenemos marcadas 6 aristas (n-1).
o Por tanto el rbol de mnima expansin resultante sera:

ALGORITMO DE PRIM: El algoritmo de Prim permite hallar el rbol minimal de


cualquier grafo valorado (con capacidades). Hay que seguir los siguientes pasos:
1. Se marca un nodo cualquiera, ser el nodo de partida.
2. Seleccionamos la arista de menor valor incidente en el nodo marcado
anteriormente, y marcamos el otro nodo en el que incide.
3. Repetir el paso 2 siempre que la arista elegida enlace un nodo marcado y otro que
no lo est.
4. El proceso termina cuando tenemos todos los nodos del grafo marcados.
Ejemplo: Determinar el rbol de mnima expansin para el siguiente grafo:

Siguiendo el algoritmo de Prim, tenemos:


o Elegimos, por ejemplo, el nodo 1 y lo marcamos.

o Elegimos la arista con menor valor incidente en 1, la (1, 3) = 1 la marcamos y


marcamos el otro nodo en el que incide, el 3.
o Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo
est, la (1, 2) = 3 la marcamos y marcamos el nodo no marcado, el 2.
o Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo
est, la (2, 5) = 5 la marcamos y marcamos el nodo no marcado, el 5.
o Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo
est, la (5, 6) = 1 la marcamos y marcamos el nodo no marcado, el 6.
o Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo
est, la (5, 7) = 2 la marcamos y marcamos el nodo no marcado, el 7.
o Elegimos la arista con menor valor incidente en un nodo marcado y otro que no lo
est, la (5, 4) = 6 la marcamos y marcamos el nodo no marcado, el 4.
o FIN. Finalizamos dado que tenemos marcados los 7 nodos del grafo.
o Por tanto el rbol de mnima expansin resultante sera:

Camino Ms Corto - Algoritmo de Dijkstra y algoritmo de


Floyd

Problema del camino ms corto: Consiste en encontrar la ruta ms corta entre dos
nodos dados de un grafo dirigido y valuado (con capacidades). Veremos dos
algoritmos, por un lado el algoritmo de Dijkstra, que encuentra el camino ms corto
entre el nodo origen y cada uno de los otros nodos de la red, y por otro lado el
algoritmo de Floyd, que encuentra el camino ms corto entre cualquier par de nodos
de la red.
ALGORITMO DE DIJKSTRA: Tendremos a lo largo de todo el proceso dos
conjuntos y dos vectores:
o Conjunto C: Conjunto de vrtices candidatos. Inicialmente contiene todos los
nodos menos el nodo origen.
o Conjunto S: Conjunto de vrtices seleccionados, es decir, aquellos para los que ya
conocemos su camino mnimo desde el nodo origen. Inicialmente contiene el
nodo origen.
o Vector D: Almacenar la longitud del camino ms corto desde el origen a cada
nodo. Tendr tantas posiciones como nodos tenga el grafo. El coste de ir del nodo
origen a s mismo lo estimaremos como cero.
o Vector P: Almacenar el nodo predecesor a cada nodo en el camino ms corto
desde el origen hasta l. Tendr tantas posiciones como nodos tenga el grafo. La
posicin del nodo predecesor al origen estableceremos que sea cero para indicar
que es el nodo origen.
o Llamaremos al nodo origen o, y el coste de ir del nodo i al nodo j lo denotaremos
como COSTEij .
Hay que seguir los siguientes pasos:
o Seleccionamos el nodo que sea destino de la arista con menor valor que salga del
nodo o, llammoslo u. Introducimos el nodo u en S y lo sacamos de C.
Almacenamos en la posicin u del vector D el valor COSTEou y en la posicin u
del vector P el valor del nodo predecesor, es decir, o.

o Seleccionamos el siguiente nodo al que podamos llegar con menor coste, bien
directamente desde o, bien a travs del otro nodo seleccionado u. Llamamos al
nuevo nodo seleccionado v. Introducimos el nodo v en S y lo sacamos de C.
Introducimos en la posicin v del vector D el coste de llegar al nodo v, si es
directamente desde o ser COSTEov, si es a travs de u ser D[u]+COSTEuv. Por
ltimo, en la posicin v del vector P introducimos el valor del nodo predecesor, ya
sea o o u.
o Repetiremos este proceso hasta que todos los nodos hayan sido seleccionados, es
decir, hasta que el conjunto C est vaco, o lo que es lo mismo, hasta que en el
conjunto S se encuentren todos los nodos del grafo. En ese momento en el vector
D tendremos almacenado el coste mnimo para llegar desde el nodo origen a
cualquier nodo del grafo, y podremos obtener el camino ms corto mediante el
vector P.
Ejemplo: Aplicar el algoritmo de Dijkstra sobre el siguiente grafo siendo el nodo
origen el 1:

Inicio

1->3 - 30
1

Nodo3
1->2 -100

{2, 3, 4,
5}
{2, 4,
5}

{1}

{1, 3}

1 2 3 4

1 2 3 4 5
0

1 2

4 5

30

1 2

30 40

1 2 3 4 5
0

1->2 -100
2

1->3->4 - 40

Nodo 4

{2, 5}

Nodo 2

{5}

Nodo 5

{}FIN

{1, 3,
4}

1 2 3 4 5
0

1 3

1->3->5 90
1->2 -100
1->3->5 - 90
3

1->3->4->5 90

{1, 2,

1 2

4 5

3, 4}

0 55 30 40

{1, 2,

1 2

1 2 3 4 5
0 4 1 3

1->3->4->2 55
1->3->5 - 90
4

1->3->4->5 90

1 2 3 4 5

3, 4, 5} 0 55 30 40 90

0 4 1 3 3

La ruta ms corta entre el nodo origen y cualquier otro nodo de la red se determina
empezando en el nodo del punto de destino deseado y retrocediendo a travs de los
nodos, utilizando la informacin proporcionada por el vector P.

ALGORITMO DE FLOYD: El algoritmo de Floyd es ms general que el de


Dijkstra, ya que determina la ruta ms corta entre dos nodos cualquiera de la red.
o El algoritmo representa una red de n nodos como una matriz cuadrada de orden n,
la llamaremos matriz C. De esta forma, el valor Cij representa el coste de ir desde
el nodo i al nodo j, inicialmente en caso de no existir un arco entre ambos, el valor
Cij ser infinito.
o Definiremos otra matriz D, tambin cuadrada de orden n, cuyos elementos van a
ser los nodos predecesores en el camino hacia el nodo origen, es decir, el valor Dij
representar el nodo predecesor a j en el camino mnimo desde i hasta j.
Inicialmente se comienza con caminos de longitud 1, por lo que Dij = i.
o Las diagonales de ambas matrices representan el coste y el nodo predecesor para
ir de un nodo a si mismo, por lo que no sirven para nada, estarn bloqueadas.
Los pasos a dar en la aplicacin del algoritmo de Floyd son los siguientes:
o Formar las matrices iniciales C y D.
o Se toma k=1.
o Se selecciona la fila y la columna k de la matriz C y entonces, para i y j, con ik,
jk e ij, hacemos:
Si (Cik + Ckj) < Cij Dij=Dkj y Cij=Cik + Ckj
En caso contrario, dejamos las matrices como estn.

o Si k n, aumentamos k en una unidad y repetimos el paso anterior, en caso


contrario paramos las iteraciones.
o La matriz final C contiene los costes ptimos para ir de un vrtice a otro, mientras
que la matriz D contiene los penltimos vrtices de los caminos ptimos que unen
dos vrtices, lo cual permite reconstruir cualquier camino ptimo para ir de un
vrtice a otro.
Ejemplo: Aplicar el algoritmo de Floyd sobre el siguiente grafo para obtener las
rutas ms cortas entre cada dos nodos. El arco (3, 5) es direccional, de manera que
no est permitido ningn trfico del nodo 5 al nodo 3. Todos los dems arcos
permiten el trfico en ambas direcciones.

o Inicializamos las matrices :


Matriz C

Matriz D

10

10

15

o Tomamos k=1:
Matriz C

Matriz D

10

13

10

13

15

o Tomamos i=2 (i k):

j=3 (jk, ji): C[2,1]+C[1,3] = 3+10 = 13 < C[2,3] = , por tanto


hacemos:
C[2,3] = 13 y D[2,3] = 1.

j=4 (jk, ji): C[2,1]+C[1,4] = 3+ = , no hay que cambiar nada,


no podemos llegar de 2 a 4 a travs de 1.

j=5 (jk, ji): C[2,1]+C[1,5] = 3+ = , no hay que cambiar nada,


no podemos llegar de 2 a 5 a travs de 1.

o Tomamos i=3 (i k):

j=2 (jk, ji): C[3,1]+C[1,2] = 10+3 = 13 < C[3,2] = , por tanto


hacemos:
C[3,2] = 13 y D[3,2] = 1.

j=4 (jk, ji): C[3,1]+C[1,4] = 10+ = , no hay que cambiar


nada, no podemos llegar de 3 a 4 a travs de 1.

j=5 (jk, ji): C[3,1]+C[1,5] = 10+ = , no hay que cambiar


nada, no podemos llegar de 3 a 5 a travs de 1.

o Tomamos i=4 (i k):

j=2 (jk, ji): C[4,1]+C[1,2] = +3 = , no hay que cambiar nada,


no podemos llegar de 4 a 2 a travs de 1.

j=3 (jk, ji): C[4,1]+C[1,3] = +10 = , no hay que cambiar


nada, no podemos llegar de 4 a 3 a travs de 1.

j=5 (jk, ji): C[4,1]+C[1,5] = + = , no hay que cambiar nada,


no podemos llegar de 4 a 5 a travs de 1.

o Tomamos i=5 (i k), en este caso ocurre como en el paso anterior, como
C[5,1]=, entonces no habr ningn cambio, no puede haber ningn camino
desde 5 a travs de 1.

o Tomamos k=2:
Matriz C

Matriz D

10

13

10

13

15

o Tomamos i=1:
j=3: C[1,2]+C[2,3] = 3+13 = 16 > C[1,3] = 10 , por tanto no hay

que cambiar nada, el camino es mayor que el existente.


j=4: C[1,2]+C[2,4] = 3+5 = 8 < C[1,4] = , por tanto hacemos:

C[1,4] = 8 y D[1,4] = 2 .
j=5: C[1,2]+C[2,5] = 3+ = , no hay que cambiar nada.

o Tomamos i=3:
j=1: C[3,2]+C[2,1] = 13+3 = 16 > C[3,1] = 10, no hay que

cambiar nada.
j=4: C[3,2]+C[2,4] = 13+5 = 18 > C[3,4] = 6, no hay que cambiar

nada.
j=5: C[3,2]+C[2,5] = 13+ = , no hay que cambiar nada.

o Tomamos i=4:
j=1: C[4,2]+C[2,1] = 5+3 = 8 < C[4,1] = , por tanto hacemos:

C[4,1] = 8 y D[4,1] = 2.
j=3: C[4,2]+C[2,3] = 5+13 = 18 > C[4,3] = 6, no hay que cambiar

nada.
j=5: C[4,2]+C[2,5] = 5+ = , no hay que cambiar nada.

o Tomamos i=5, como C[5,2]=, entonces no habr ningn cambio.


o Tomamos k=3:
Matriz C

Matriz D

10

25

13

28

10

13

15

o Tomamos i=1:
j=2: C[1,3]+C[3,2] = 10+13 = 23 > C[1,2] = 3, no hay que

cambiar nada.
j=4: C[1,3]+C[3,4] = 10+6 = 16 > C[1,4] = 8, no hay que cambiar

nada.
j=5: C[1,3]+C[3,5] = 10+15 = 25 < C[1,5] = , por tanto

hacemos:
C[1,5] = 25 y D[1,5] = 3 .
o Tomamos i=2:
j=1: C[2,3]+C[3,1] = 13+10 = 23 > C[2,1] = 3, no hay que

cambiar nada.
j=4: C[2,3]+C[3,4] = 13+6 = 19 > C[2,4] = 5, no hay que cambiar

nada.
j=5: C[2,3]+C[3,5] = 13+15 = 28 < C[2,5] = , por tanto

hacemos:
C[2,5] = 28 y D[2,5] = 3.
o Tomamos i=4:
j=1: C[4,3]+C[3,1] = 6+10 = 16 > C[4,1] = 8, no hay que cambiar

nada.
j=2: C[4,3]+C[3,2] = 6+13 = 19 > C[4,2] = 5, no hay que cambiar

nada.
j=5: C[4,3]+C[3,5] = 6+15 = 21 > C[4,5] = 4, no hay que cambiar

nada.
o Tomamos i=5, como C[5,3]=, entonces no habr ningn cambio.
o Tomamos k=4:
Matriz C
1

Matriz D
4

10

12

11

10

11

10

12

10

o Tomamos i=1:

j=2: C[1,4]+C[4,2] = 8+5 = 13 > C[1,2] = 3, no hay que cambiar


nada.

j=3: C[1,4]+C[4,3] = 8+6 = 14 > C[1,3] = 10, no hay que cambiar


nada.

j=5: C[1,4]+C[4,5] = 8+4 = 12 < C[1,5] = 25, por tanto hacemos:


C[1,5] = 12 y D[1,5] = 4.

o Tomamos i=2:

j=1: C[2,4]+C[4,1] = 5+8 = 13 > C[2,1] = 3, no hay que cambiar


nada.

j=3: C[2,4]+C[4,3] = 5+6 = 11 < C[2,3] = 13, por tanto hacemos:


C[2,3] = 11 y D[2,3] = 4.

j=5: C[2,4]+C[4,5] = 5+4 = 9 < C[2,5] = 28, por tanto hacemos:


C[2,5] = 9 y D[2,5] = 4.

o Tomamos i=3:

j=1: C[3,4]+C[4,1] = 6+8 = 14 > C[3,1] = 10, no hay que cambiar


nada.

j=2: C[3,4]+C[4,2] = 6+5 = 11 < C[3,2] = 13, por tanto hacemos:


C[3,2] = 11 y D[3,2] = 4.

j=5: C[3,4]+C[4,5] = 6+4 = 10 < C[3,5] = 15, por tanto hacemos:


C[3,5] = 10 y D[3,5] = 4.

o Tomamos i=5:

j=1: C[5,4]+C[4,1] = 4+8 = 12 < C[5,1] = , por tanto hacemos:


C[5,1] = 12 y D[5,1] = 2.

j=2: C[5,4]+C[4,2] = 4+5 = 9 < C[5,2] = , por tanto hacemos:


C[5,2] = 9 y D[5,2] = 4.

j=3: C[5,4]+C[4,3] = 4+6 = 10 < C[5,3] = , por tanto hacemos:

C[5,3] = 10 y D[5,3] = 4.

o Tomamos k=5:
Matriz C

Matriz D

10

12

11

10

11

10

12

10

o Tomamos i=1:

j=2: C[1,5]+C[5,2] = 12+9 = 21 > C[1,2] = 3, no hay que cambiar


nada.

j=3: C[1,5]+C[5,3] = 12+10 = 22 > C[1,3] = 10, no hay que


cambiar nada.

j=4: C[1,5]+C[5,4] = 12+4 = 16 > C[1,4] = 8, no hay que cambiar


nada.

o Tomamos i=2:

j=1: C[2,5]+C[5,1] = 9+12 = 21 > C[2,1] = 3, no hay que cambiar


nada.

j=3: C[2,5]+C[5,3] = 9+10 = 19 > C[2,3] = 11, no hay que


cambiar nada.

j=4: C[2,5]+C[5,4] = 9+4 = 13 > C[2,4] = 5, no hay que cambiar


nada.

o Tomamos i=3:

j=1: C[3,5]+C[5,1] = 10+12 = 22 > C[3,1] = 10, no hay que


cambiar nada.

j=2: C[3,5]+C[5,2] = 10+9 = 19 > C[3,2] = 11, no hay que


cambiar nada.

j=4: C[3,5]+C[5,4] = 10+4 = 14 > C[3,4] = 6, no hay que cambiar


nada.

o Tomamos i=4:

j=1: C[4,5]+C[5,1] = 4+12 = 16 > C[4,1] = 8, no hay que cambiar


nada.

j=2: C[4,5]+C[5,2] = 4+9 = 13 > C[4,2] = 5, no hay que cambiar


nada.

j=3: C[4,5]+C[5,3] = 4+10 = 14 > C[4,3] = 6, no hay que cambiar


nada.

o FIN del proceso, las matrices quedan como sigue:


Matriz C

Matriz D

10

12

11

10

11

10

12

10

o Las matrices finales C y D contienen toda la informacin necesaria para


determinar la ruta ms corta entre dos nodos cualquiera de la red. Por
ejemplo, la distancia ms corta del nodo 1 al nodo 5 es C[1,5] = 12.
o Para determinar la ruta asociada del camino mnimo entre el nodo 1 y el
nodo 5 haremos lo siguiente:

Consultamos D[1,5]=4, por tanto el nodo predecesor al 5 es el 4, es


decir, 4 5.

Consultamos D[1,4]=2, por tanto el nodo predecesor al 4 es el 2, es


decir, 2 4 5.

Consultamos D[1,2]=1, por tanto el nodo predecesor al 2 es el 1, es


decir, 1 2 4 5, y as ya tenemos la ruta completa.

Flujo Mximo - Algoritmo de Ford-Fulkerson


Modelo del flujo mximo: En algunas redes circula por los arcos un flujo (envo o
circulacin de unidades homogneas de algn producto: automviles en una red de
carreteras, litros de petrleo en un oleoducto, bits por un cable de fibra ptica) desde
el origen o fuente al destino, tambin denominado sumidero o vertedero. Los arcos
tienen una capacidad mxima de flujo, y se trata de enviar desde la fuente al
sumidero la mayor cantidad posible de flujo, de tal manera que:
o El flujo es siempre positivo y con unidades enteras.
o El flujo a travs de un arco es menor o igual que la capacidad.
o El flujo que entra en un nodo es igual al que sale de l.
En el caso de que el origen o el destino no existan en el problema, se aaden
ficticiamente utilizando arcos unidireccionales de capacidad infinita, como en grafo
mostrado a continuacin:

Corte: Un corte define una serie de arcos cuya supresin de la red causa una
interrupcin completa del flujo entre el origen y el destino. La capacidad de corte es
igual a la suma de las capacidades de los arcos asociados. Entre todos los cortes
posibles en la red , el corte con la menor capacidad proporciona el flujo mximo en
la red.
El siguiente grafo ilustra 3 cortes: el Corte 1 con capacidad 60, el Corte 2 con
capacidad 110 y el Corte 3 con capacidad 70. Todo lo que podemos obtener de los 3
cortes es que el flujo mximo en la red no excede de 60 unidades. No podemos saber
cual es el flujo mximo hasta que se hayan enumerado todos los cortes en la red:

Las capacidades se identifican como sigue: por ejemplo, para el arco (3,4), el lmite
de flujo es de 10 unidades de 3 a 4 y de 5 unidades de 4 a 3.
ALGORITMO DE FORD-FULKERSON: El algoritmo de Ford-Fulkerson
propone buscar caminos en los que se pueda aumentar el flujo, hasta que se alcance
el flujo mximo.
La idea es encontrar una ruta de penetracin con un flujo positivo neto que una los
nodos origen y destino.
Consideraremos las capacidades iniciales del arco que une el nodo i y el nodo j como
Cij y Cji. Estas capacidades iniciales irn variando a medida que avanza el algoritmo,
denominaremos capacidades residuales a las capacidades restantes del arco una vez
pasa algn flujo por l, las representaremos como cij y cji.

Para un nodo j que recibe el flujo del nodo i, definimos una clasificacin [aj,i] donde
aj es el flujo del nodo i al nodo j.
Los pasos del algoritmo se definen como sigue:
o Paso 1: Inicializamos las capacidades residuales a las capacidades iniciales,
hacemos (cij,cji)=(Cij,Cji) para todo arco de la red. Suponiendo el nodo 1 como el
nodo origen, hacemos a1= y clasificamos el nodo origen con [,-]. Tomamos
i=1 y vamos al paso 2.
o Paso 2: Determinamos Si como un conjunto que contendr los nodos a los que
podemos acceder directamente desde i por medio de un arco con capacidad
positiva, y que no formen parte del camino en curso. Si Si contiene algn nodo
vamos al paso 3, en el caso de que el conjunto sea vaco saltamos al paso 4.
o Paso 3: Obtenemos kSi como el nodo destino del arco de mayor capacidad que
salga de i hacia un nodo perteneciente a Si. Es decir, cik = max{cij} con jSi.
Hacemos ak=cik y clasificamos el nodo k con [ak,i]. Si k es igual al nodo destino
o sumidero, entonces hemos encontrado una ruta de penetracin, vamos al paso 5.
En caso contrario continuamos con el camino, hacemos i=k y volvemos al paso 2.
o Paso 4 (retroceso): Si i=1, estamos en el nodo origen, y como Si es vaco,
entonces no podemos acceder a ningn nodo, ni encontrar algn nuevo camino,
hemos terminado, vamos al paso 6.
En caso contrario, i1, le damos al valor i el del nodo que se ha clasificado
inmediatamente antes, eliminamos i del conjunto Si actual y volvemos al paso 2.
o Paso 5: Llegados a este paso tenemos un nuevo camino: Np={1,k1,k2,...,n}, esta
ser la p-sima ruta de penetracin desde el nodo origen al nodo destino. El flujo
mximo a lo largo de esta ruta ser la capacidad mnima de las capacidades
residuales de los arcos que forman el camino, es decir: fp=min{a1,ak1,ak2,...,an}.
La capacidad residual de cada arco a lo largo de la ruta de penetracin se
disminuye por fp en direccin del flujo y se incrementa por fp en direccin
inversa, es decir, para los nodos i y j en la ruta, el flujo residual se cambia de la
(cij,cji) actual a (cij-fp,cji+fp) si el flujo es de i a j, o (cij+fp,cji-fp) si el flujo es
de j a i.

Inicializamos i=1 y volvemos al paso 2 para intentar una nueva ruta de


penetracin.
o Paso 6 (solucin): Una vez aqu, hemos determinado m rutas de penetracin. El
flujo mximo en la red ser la suma de los flujos mximos en cada ruta obtenida,
es decir: F=f1+f2+...+fm. Teniendo en cuenta que las capacidades residuales
inicial y final del arco (i, j) las dan (Cij,Cji) y (cij,cji) respectivamente, el flujo
mximo para cada arco se calcula como sigue: sea (, )=(Cij-cij, Cji-cji), si >0,
el flujo ptimo de i a j es , de lo contrario, si >0, el flujo ptimo de j a i es . Es
imposible lograr que tanto como sean positivas.

Ejemplo: Determinar el flujo mximo en la red siguiente:

o Iteracin 1:

o Determinamos las residuales iniciales (cij,cji) iguales a las capacidades


iniciales (Cij,Cji).
o Paso 1: Hacemos ai=, y clasificamos el nodo 1 con [a1,-]. Tomamos i=1.
o Paso 2: S1={2,3,4} (no vaco).
o Paso 3: k=3 ya que c13=max{c12,c13,c14}={20,30,10}=30. Hacemos
a3=c13=30 y clasificamos el nodo 3 con [30,1]. Tomamos i=3 y repetimos
el paso 2.
o Paso 2: S3={4,5}
o Paso 3: k=5 y a5=c35=max{10,20}=20. Clasificamos el nodo 5 con [20,3].
Logramos la penetracin, vamos al paso 5.
o Paso 5: La ruta de la penetracin se determina de las clasificaciones
empezando en el nodo 5 y terminando en el nodo 1, es decir,
5[20,3]3[30,1]1.
Entonces la ruta es N1={1,3,5} y f1=min{a1,a3,a5}={,30,20}=20. Las
capacidades residuales a lo largo de esta ruta son:
(c13,c31)=(30-20, 0+20)=(10,20)
(c35,c53)=(20-20, 0+20)=(0,20)
o Iteracin 2:

o Paso 1: Hacemos ai=, y clasificamos el nodo 1 con [a1,-]. Tomamos i=1.


o Paso 2: S1={2,3,4}.
o Paso 3: k=2 y a2=c12=max{20,10,10}=20. Clasificamos el nodo 2 con
[20,1]. Tomamos i=2 y repetimos el paso 2.
o Paso 2: S2={3,5}
o Paso 3: k=3 y a3=c23=max{30,40}=40. Clasificamos el nodo 3 con [40,2].
Tomamos i=3 y repetimos el paso 2.
o Paso 2: S3={4} (c35=0, el nodo 1 ya ha sido clasificado y el nodo 2 cumple
ambas condiciones, por tanto los nodos 1, 2 y 5 no pueden ser incluidos en
S3).
o Paso 3: k=4 y a4=c34=10. Clasificamos el nodo 4 con [10,3]. Tomamos
i=4 y repetimos el paso 2.
o Paso 2: S4={5}
o Paso 3: k=5 y a5=c45=20. Clasificamos el nodo 5 con [20,4]. Logramos la
penetracin, vamos al paso 5.
o Paso

5:

La

ruta

de

la

penetracin

es:

5[20,4]4[10,3]3[40,2]2[20,1]1.
Entonces la ruta es N2={1,2,3,4,5} y f2=min{,20,40,10,20}=10. Las
capacidades residuales a lo largo de esta ruta son:
(c12,c21)=(20-10, 0+10)=(10,10)
(c23,c32)=(40-10, 0+10)=(30,10)

(c34,c43)=(10-10, 5+10)=(0,15)
(c45,c54)=(20-10, 0+10)=(10,10)
o Iteracin 3:

o Paso 1: Hacemos ai=, y clasificamos el nodo 1 con [a1,-]. Tomamos i=1.


o Paso 2: S1={2,3,4}.
o Paso 3: k=2 y a2=c12=max{10,10,10}=10, rompemos el empate
arbitrariamente. Clasificamos el nodo 2 con [10,1]. Tomamos i=2 y
repetimos el paso 2.
o Paso 2: S2={3,5}
o Paso 3: k=3 y a3=c23=max{30,30}=30. Clasificamos el nodo 3 con [30,2].
Tomamos i=3 y repetimos el paso 2.
o Paso 2: S3 vaco ya que c34=c35=0. Vamos al paso 4 para retroceder.
o Paso 4: La clasificacin [30,2] nos dice que el nodo inmediatamente
precedente es el 2. Eliminamos el nodo 3 de una consideracin posterior en
esta iteracin. Tomamos i=2 y repetimos el paso 2.
o Paso 2: S2={5}
o Paso 3: k=5 y a5=c25=30. Clasificamos el nodo 5 con [30,2]. Logramos la
penetracin, vamos al paso 5.
o Paso 5: La ruta de la penetracin es: 5[30,2]2[10,1]1.
Entonces la ruta es N2={1,2,5} y f3=min{,10,30}=10. Las capacidades
residuales a lo largo de esta ruta son:

(c12,c21)=(10-10, 10+10)=(0,20)
(c25,c52)=(30-10, 0+10)=(20,10)
o Iteracin 4:

o Paso 1: Hacemos ai=, y clasificamos el nodo 1 con [a1,-]. Tomamos i=1.


o Paso 2: S1={3,4}.
o Paso 3: k=3 y a3=c13=max{10,10}=10. Clasificamos el nodo 3 con [10,1].
Tomamos i=3 y repetimos el paso 2.
o Paso 2: S3={2}
o Paso 3: k=2 y a2=c32=10. Clasificamos el nodo 2 con [10,3]. Tomamos
i=2 y repetimos el paso 2.
o Paso 2: S2={5}
o Paso 3: k=5 y a5=c25=20. Clasificamos el nodo 5 con [20,2]. Logramos la
penetracin, vamos al paso 5.
o Paso 5: La ruta de la penetracin es: 5[20,2]2[10,3]3[10,1]1.
Entonces la ruta es N4={1,3,2,5} y f4=min{,10,10,20}=10. Las capacidades
residuales a lo largo de esta ruta son:
(c13,c31)=(10-10, 20+10)=(0,30)
(c32,c23)=(10-10, 30+10)=(0,40)
(c25,c52)=(20-10, 10+10)=(10,20)
o Iteracin 5:

o Paso 1: Hacemos ai=, y clasificamos el nodo 1 con [a1,-]. Tomamos i=1.


o Paso 2: S1={4}.
o Paso 3: k=4 y a4=c14=10. Clasificamos el nodo 4 con [10,1]. Tomamos
i=4 y repetimos el paso 2.
o Paso 2: S4={3,5}
o Paso 3: k=3 y a3=c23=max{15,10}=15. Clasificamos el nodo 3 con [15,4].
Tomamos i=3 y repetimos el paso 2.
o Paso 2: S3 vaco ya que c32=c34=c35=0. Vamos al paso 4 para retroceder.
o Paso 4: La clasificacin [15,4] nos dice que el nodo inmediatamente
precedente es el 4. Eliminamos el nodo 3 de una consideracin posterior en
esta iteracin. Tomamos i=4 y repetimos el paso 2.
o Paso 2: S4={5}
o Paso 3: k=5 y a5=c45=10. Clasificamos el nodo 5 con [10,4]. Logramos la
penetracin, vamos al paso 5.
o Paso 5: La ruta de la penetracin es: 5[10,4]4[10,1]1.
Entonces la ruta es N2={1,4,5} y f3=min{,10,10}=10. Las capacidades
residuales a lo largo de esta ruta son:
(c14,c41)=(10-10, 0+10)=(0,10)
(c45,c54)=(10-10, 10+10)=(0,20)
o Iteracin 6:

o No son posibles ms penetraciones, debido a que todos los arcos fuera del
nodo 1 tienen residuales cero. Vayamos al paso 6 para determinar la
solucin.
o Paso 6: El flujo mximo en la red es F=f1+f2+...+f5=60 unidades. El flujo en los
diferentes arcos se calcula restando las ltimas residuales obtenidas en la ltima
iteracin de las capacidades iniciales:
Arco

(Cij, Cji) - (cij, cji)en it. 6

Cantidad de flujo

Direccin

(1,2)

(20, 0) - (0, 20) = (20, -20)

20

12

(1,3)

(30, 0) - (0, 30) = (30, -30)

30

13

(1,4)

(10, 0) - (0, 10) = (10, -10)

10

14

(2,3)

(40, 0) - (40, 0) = (0, 0)

(2,5)

(30, 0) - (10, 20) = (20, -20)

20

25

(3,4)

(10, 5) - (0, 15) = (10, -10)

10

34

(3,5)

(20, 0) - (0, 20) = (20, -20)

20

35

(4,5)

(20, 0) - (0, 20) = (20, -20)

20

45

Vous aimerez peut-être aussi