You are on page 1of 9

Lectura 4: Caminos mnimos en Grafos

Temas:
4.1 Problema de los caminos mnimos
4.2 Problema del camino mnimo sin pesos
4.3 Problema del camino mnimo con pesos positivos
4.4 Problema del camino mnimo con pesos
Bibliografa:
- Estructuras de Datos en Java, Mark Weiss, Addison Wesley, 2000, captulo 14.

4.1 Problema de los caminos mnimos


Uno de los problemas ms comunes en la teora de grafos consiste en encontrar el camino
mnimo entre 2 vrtices dados. Por ejemplo, si tenemos un grafo representando aeropuertos y
rutas de vuelo de una o varias compaas areas, podramos usarlo para consultar cual es la ruta
ms econmica para ir desde Buenos Aires a Hong Kong. O quizs deseamos encontrar la ruta
ms corta, con menos aeropuertos intermedios, o con menos horas de vuelo. En cualquier caso,
debemos almacenar para cada tramo los pesos correspondientes a cada criterio (costo del billete,
distancia, tiempo de vuelo). Ntese que cada tramo es una arista del grafo.
La resolucin al problema de los caminos mnimos tiene diferentes algoritmos de resolucin y
diferentes complejidades, dependiendo de las caractersticas del grafo. La resolucin es bastante
simple en el caso de los grafos no ponderados. Si las aristas tienen pesos positivos, su resolucin
es algo ms compleja. Para el caso ms general, cuando las aristas tienen pesos positivos o
negativos, la resolucin es an ms compleja. A continuacin exploramos cada uno de estos
casos.

4.2 Problema del camino mnimo sin pesos


El problema del Camino Mnimo sin Pesos con un nico origen consiste en encontrar el camino
ms corto, medido por el nmero de aristas, desde el vrtice de origen a cualquier otro vrtice del
grafo. Es importante resaltar que este problema se suele asociar a los grafos no ponderados, ya
que en este caso la longitud del camino entre dos vrtices est dada por el nmero de aristas que
componen dicho camino.

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-1-

V0

V1

V2

V3

V4

V5

V6

Figura 1. Grafo no ponderado


En el grafo de la Figura 1, asumimos que el vrtice de origen O es V2. El algoritmo que resuelve el
problema de los caminos mnimos sin pesos, comienza encontrando el camino de longitud 0 al
nodo de origen. Por definicin, el camino ms corto desde O a V2 es un camino de longitud 0.
Ahora miramos los vrtices a distancia 1 de O (V0 y V5), a continuacin buscamos los vrtices a
distancia 2 y as sucesivamente. Esta estrategia se llama bsqueda en anchura, o Breadth First

Search (BFS). En la Lectura 7 el alumno podr ver como funciona esta estrategia para encontrar
los caminos mnimos desde el vrtice de origen a cada uno de los vrtices del grafo.
Note que habrn algunos casos en el que existan vrtices no alcanzables desde el vrtice de
origen. En este caso, diremos que la distancia a dichos vrtices es infinita. Por ejemplo, en la
Figura 1, si el vrtice de origen es V4, entonces el vrtice V6 se encuentra a distancia 1, el vrtice
V5 se encuentra a distancia 2, y el resto de vrtices estn a distancia infinita, ya que no es posible
construir un camino entre V4 y dichos vrtices.

Dv+1

Dv

Figura 2. Principio de funcionamiento

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-2-

El principio de funcionamiento de dicho algoritmo est ejemplificado en la Figura 2. Ntese que


desde el vrtice de origen O vamos construyendo un camino de distancia Dv hasta un nodo v.
Para todo nodo w adyacente a v, hay un camino de distancia Dv+1 desde O a w.
El algoritmo de bsqueda empieza asumiendo que Dw=, para todo vrtice w diferente a O.
Luego el grafo se explora en anchura, y cada vez que se llega a un vrtice w cuya distancia es
se reduce su Dw, que pasa a valer Dv+1, donde Dv es el nodo que estamos explorando
actualmente. El alumno debiera notar que el hecho que el algoritmo finalice no garantiza que
todos los vrtice del grafo finalizan con valores Dw diferentes a Slo aquellos vrtices

alcanzables desde el vrtice de origen tendrn un valor de Dw diferente a . Recordemos que un


vrtice w es alcanzable desde un vrtice v si existe un camino que lleva desde v a w.
Analicemos ahora qu estructuras de datos necesitamos para implementar el algoritmo descripto
anteriormente. El alumno debiera notar que existen dos acciones bsicas a realizar:
-

Necesitamos buscar repetidamente el vrtice a procesar

Necesitamos comprobar rpidamente los vrtices adyacentes al vrtice actual.

Omitamos por un momento el primer problema, y enfoquemos nuestra atencin en el segundo


problema, qu es ms simple de resolver. Esto es as, ya que hemos visto que los grafos se
representan en general usando una lista o una matriz de adyacencia. En cualquier caso, los
vrtices adyacentes se encuentran iterando sobre dicha estructura. En el caso de las listas de
adyacencia, simplemente accederemos a cada uno de los nodos de la lista enlazada para dicho
vrtice. En el caso de las matrices de adyacencia, tendremos que recorrer todo la fila
correspondiente al vrtice siendo procesado, para detectar aquellos vrtices que son adyacentes
al actual (es decir, si el vrtice siendo procesado es v, quiero detectar todos los vrtices w tal que
m[v][w]=1). Obviamente, para realizar esta operacin, es ms eficiente emplear una lista de
adyacencia para implementar el grafo, ya que la matriz obliga a recorrer posiciones que no
necesariamente pertenecen a la lista de adyacencia del vrtice siendo procesado. Note adems
que si usamos una lista de adyacencia, cada arista se procesar a lo sumo una vez, por lo que el
costo total de las iteraciones sobre las listas de adyacencia ser de O(|E|).
Por ejemplo, si nos remitimos al grafo de la figura 1, observaremos que si el vrtice de origen
fuese V2, entonces todas las aristas del grafo seran procesadas exactamente una vez, ya que
todos los vrtices del grafo son alcanzables desde dicho vrtice de origen. Por otra parte, si el

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-3-

vrtice de origen fuese V4, solo las aristas que conectan a los vrtices V5 y V6 seran procesadas
una vez, ya que el resto de vrtices no son alcanzables desde dicho vrtice de origen.
Volvamos ahora al primer problema, qu intenta encontrar rpidamente cual es el siguiente vrtice
a procesar. Si empleamos un vector conteniendo listas de adyacencia para cada vrtice del grafo,
explorar el vector que la implementa buscando un vrtice en particular tiene un costo medio de
O(|V|), que es el tamao de dicho vector. Pero esta operacin se hace O(|V|) veces, ya que para
cada vrtice siendo procesado debemos decidir cual es el siguiente vrtice a procesar. Esta
bsqueda secuencial sobre el vector es demasiada costosa. Para resolver este problema,
notamos que en lugar de considerar todos los vrtices del grafo como potenciales candidatos a
ser el prximo vrtice a procesar, podemos considerar solamente a aquellos vrtices w que han
visto rebajado su Dw desde . Para poder procesar exclusivamente dichos vrtices y no otros,
necesitamos almacenarlos en una estructura auxiliar. Debido a que deseamos procesar los
vrtices en el orden en que su distancia deja de ser , parece apropiado usar una cola como
estructura auxiliar.
Usando una cola, el algoritmo comienza tomando el vrtice de origen y ponindolo en una cola
vaca. A continuacin, tomamos el primer vrtice de la cola, recorremos su lista de adyacencia, y
los ponemos en la cola. Todos estos vrtices estarn a distancia Dv+1 respecto del vrtice actual
v. El algoritmo contina que la cola queda vaca. Note que el uso de una cola posibilita procesar
primero todos aquellos vrtices que estn a distancia 1 del vrtice de origen, luego aquellos
vrtices que estn a distancia 2, a continuacin los vrtices que estn a distancia 3, etc. Recuerda
que cada vez que estamos procesando los vrtices adyacentes al vrtice actual, solo
introduciremos en la cola los vrtices w que ven decrementada su Dw desde . El uso de la cola
permite que el costo para elegir el siguiente vrtice a procesar sea constante (O(1)), por lo que el
costo total de esta operacin sobre todos los vrtices del grafo ser de O(|V|).
Con este anlisis ya podemos saber cual es el costo total del algoritmo, basado en las 2
operaciones descriptas anteriormente. La eleccin del siguiente vrtice a procesar cuesta en total,
O(|V|), mientras que descubrir los vrtices adyacentes al vrtice siendo procesado tiene un costo
total de O(|E|). En otras palabras, el costo total del algoritmo, desde que comienza hasta que
procesa todos los vrtices es de O(|V|+|E|).

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-4-

4.3 Problema de los caminos mnimos con pesos positivos


El problema de los caminos mnimos con pesos positivos y origen nico consiste en encontrar el
camino ms corto desde el vrtice origen O al resto de vrtices del grafo, donde el peso o costo
de cada arista del grafo es un valor no negativo. El alumno debe recordar que en el caso de los
grafos ponderados, la longitud de un camino con pesos es la suma del costo de las aristas del
camino. Al restringir el problema a grafos con aristas de peso positivo, garantizamos que cualquier
camino del grafo tiene un costo positivo. Esto permite usar un algoritmo sencillo y eficiente para
encontrar todos los caminos mnimos desde un vrtice de origen, que fu propuesto por el
cientfico holands Edsger Dijkstra. Dijkstra es uno de los mayores contribuidores a las Ciencias
de la Computacin. Entre sus contribuciones a la informtica est el problema del camino ms
corto, tambin conocido como el algoritmo de Dijkstra, la Notacin polaca inversa y el relacionado
algoritmo shunting yard, el algoritmo del banquero y la construccin del semforo para coordinar
mltiples procesadores y programas. Otro concepto debido a Dijkstra, en el campo de la
computacin distribuida, es el de la auto-estabilizacin, una va alternativa para garantizar la
confiabilidad del sistema.

Figura 3. Edsger Wybe Dijkstra


Fuente: http://es.wikipedia.org/wiki/Archivo:Edsger_Wybe_Dijkstra.jpg

El algoritmo de Dijkstra para la resolucin del problema de los caminos mnimos con pesos
positivos es muy similar al algoritmo que resuelve el problema de los caminos mnimos sin pesos.
Este algoritmo debe resolver dos problemas principales:

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-5-

Cmo ajustamos el valor de Dw de cada vrtice w del grafo?

Cmo buscamos el siguiente vrtice v a ser procesado?

En el primer problema, debemos notar que a diferencia del problema del camino mnimo sin
pesos, cada vrtice w puede ser visitado varias veces, y su Dw se puede actualizar mltiples
veces. Tomemos el ejemplo de la Figura 4. Como vemos en este grafo, el vrtice u ya ha sido
procesado, Du tiene un valor de 2, y al procesar este vrtice hemos decrementado Dw a 8, ya que
existe una arista de peso 6 que conduce a w desde u. En el algoritmo de los caminos mnimos sin
pesos, el vrtice w ira a la cola, y Dw no volvera a ser modificado. Sin embargo, cuando existen
pesos, podra ocurrir que al procesar otro vrtice como v, podamos encontrar un camino de menor
peso que conduzca hasta w. En el grfico de la Figura 4, observamos que existe un camino de
costo 3 que lleva desde el origen hasta v, y una arista de costo 2 que lleva desde v hasta w, por lo
que podramos encontrar un camino de menor costo que lleva desde el vrtice de origen hasta w,
pasando por v. En este ejemplo, ese camino tendra costo 5. Basados en este ejemplo, podemos
resolver el problema de saber como ajustar el valor de Dw de cada vrtice del grafo, haciendo
Dw=Dv+cv,w
si Dv+cv,w es menor que el valor actual de Dw, para cada vrtice w adyacente al vrtice v siendo
procesado actualmente.

Figura 4. Actualizacin de Dw

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-6-

El segundo problema plantea la eleccin del siguiente vrtice a ser procesado. En el caso del
algoritmo que resuelve el problema de los caminos mnimos sin pesos, usamos una cola como
estructura auxiliar para determinar el orden en que los vrtices deban ser procesados. En este
caso, debemos prestar atencin a un teorema que dice que debemos posar nuestra atencin en
vrtices no visitados que minimicen el valor Dv para cada vrtice v del grafo, con el propsito de
garantizar que el algoritmo produce correctamente los caminos mnimos. En otras palabras, el
siguiente vrtice a procesar en cada paso del algoritmo, debiera ser aquel vrtice v aun no
procesado cuyo Dv sea el menor entre todos los vrtices no procesados. Dicho esto, podemos
comprobar rpidamente que una cola no es una estructura adecuada para este propsito. Para
ver esto, supongamos, usando la Figura 4, que luego de procesar u ponemos a w en la cola
existente. Actualmente estamos procesando todos los vrtices de distancia 2 desde el origen. El
orden en que los insertamos en la cola podra estar relacionado con el costo de las aristas de la
lista de adyacencia de u. Supongamos que existe una arista de costo 5 que lleva desde u a un
vrtice z. Entonces z se insertara antes que w en dicha cola. Sin embargo, al procesar v,
cambiaramos el valor de Dw de 8 a 5. Esto significara que ahora debiramos procesar w antes
que z. Sin embargo, z fue insertado antes que w en la cola, y por lo tanto ser procesado antes.
Con esto vemos que una cola no es apropiada, sin embargo, una cola de prioridad ordenada por
Dw s sera de utilidad, y cumplira exactamente con el propsito deseado. En el ejemplo que
venamos siguiendo, al procesar el vrtice v insertaramos en la cola de prioridad el par (w,5).
Note que en la estructura existira ya una instancia (w,8). El hecho que existan dos instancias
simplemente indicara que existen al menos 2 caminos que llevan desde el vrtice de origen al
vrtice w, uno de costo 5 y el otro de costo 8. Eventualmente, sacaramos de la cola de prioridad
el par (w,5), procederamos a procesar el vrtice w, y dejaramos 5 como valor final de Dw.
Eventualmente, cuando sacsemos de la cola de prioridad el par (w,8), simplemente lo
descartaramos ya que el vrtice w figurara en nuestra lista de vrtices procesados.
Notemos que en la eleccin del nuevo vrtice v a ser procesado, eliminamos repetidamente el
menor elemento de la cola de prioridad hasta sacar un vrtice no visitado. Ya que la cola de
prioridad contendr a lo sumo tantos elementos como aristas hayan en el grafo, realizaremos |E|
inserciones y eliminaciones, donde cada una de estas operaciones cuesta O(log N), siendo
N=O(|E|). Por lo tanto, el costo total de la eleccin del nuevo vrtice ser de O(|E| log |E|), y ese
es a su vez el costo total del algoritmo, ya que al igual que en el caso del algoritmo que encuentra
todos los caminos mnimos sin pesos, cuesta O(|E|) el determinar todos los vrtices adyacentes a
cada vrtice siendo procesado. Por lo tanto, el costo total estara dado por O(|E| log |E| + |E|), que
Materia: Algoritmos y Estructuras de Datos 2
Profesor: Claudio Ochoa

-7-

es lo mismo que O(|E| log |E|), por propiedades de la notacin O.


En la Lectura 8 observamos un ejemplo de cmo el algoritmo de Dijkstra se comporta para un
grafo de ejemplo.

4.4 Problema de los caminos mnimos con pesos

El problema de los caminos mnimos con pesos y origen nico consiste en encontrar el camino
ms corto desde el vrtice origen O al resto de vrtices del grafo, donde el peso de cada arista del
grafo puede ser un valor positivo, negativo, o cero. Claramente, este caso es el mas general de
todos los problemas que resuelven el problema de los caminos mnimos. Si restringimos el
problema a grafos conteniendo aristas de peso positivo, estamos frente al problema resuelto en la
seccin 4.3. Si restringimos el problema an ms, y consideramos solamente grafos que
contengan aristas de peso 1, entonces estaremos frente al problema resuelto en la seccin 4.2.
En este punto, el alumno debiera notar que el hecho de que existan aristas de peso negativo hace
que el algoritmo de Dijkstra no funcione correctamente, en aquellos casos donde existan en el
grafo ciclos cuyo costo sea negativo. Esto es simple de ver, ya que de existir tal ciclo, uno podra
dar vueltas indefinidamente para alcanzar un camino a otro vrtice de menor costo. Para ver esto
ms claramente, observemos el grafo de la Figura 5, donde vemos que el ciclo V 1, V3, V4, V1 tiene
un costo negativo de -5. En este caso, supongamos que deseamos encontrar el camino mnimo
que lleva desde V3 a V4. El camino directo entre ambos vrtices tiene costo 2. Sin embargo,
observamos que existe un camino ms corto V3, V4 , V1 , V3 , V4 con costo -3. Pero claramente,
podemos dar vueltas arbitrariamente al ciclo, es decir, construir un camino V3, V4 , (V1 , V3 , V4)*,
donde (V1 , V3 , V4)* implica que se dan varias vueltas al ciclo V1 , V3 , V4, V1, y hacer que el costo
final del camino sea menor, por lo que concluimos que el camino ms corto que lleva del vrtice
V3 al vrtice V4 est indefinido.
Este problema no se restringe a vrtices en el ciclo. Por ejemplo, si deseamos encontrar el camino
ms corto que lleva desde el vrtice V2 al vrtice V5, concluiramos de igual manera de que dicho
camino es indefinido, ya que existen maneras de entrar y salir del ciclo. Por ejemplo, uno podra
elegir el siguiente camino V2, V0, (V3, V4 , V1)*, V6 , V5, donde (V3 , V4 , V1)* implica que se dan
varias vueltas al ciclo V3 , V4, V1, V3.

Materia: Algoritmos y Estructuras de Datos 2


Profesor: Claudio Ochoa

-8-

2
V0
4

V2

V1
1

V3

2
8

5
V5

-10

4
1

V4

6
V6

Figura 5. Problemas con ciclos de costo negativo

Por otra parte, es importante destacar que las aristas de costo negativo no representan un
problema en aquellos grafos en los que no existen ciclos negativos. En dichos grafos, el algoritmo
de Dijkstra funciona correctamente.
El algoritmo que resuelve el problema general de los caminos mnimos, es una combinacin de los
algoritmos vistos anteriormente para resolver los caminos mnimos sin pesos y con pesos
positivos. Este algoritmo sufre un incremento drstico en su tiempo de ejecucin, ya que cada
vrtice v puede ser procesado varias veces durante la ejecucin del algoritmo, haciendo que su
valor de Dv pueda ser modificado varias veces tambin. En este algoritmo, utilizamos nuevamente
una cola, en lugar de una cola de prioridad, pero insertando Dv+cv,w como medida de la distancia.
Debemos tener en cuenta que cuando visitemos un vrtice v por i-sima vez el valor de Dv es la
longitud del camino ms corto formado por, a lo sumo, i aristas. Lo interesante de este algoritmo
es que permite detectar ciclos de costo negativo (en cuyo caso, como ya dijimos, las distancias a
aquellos vrtices que son alcanzables a travs de un ciclo negativo estarn indefinidas). En
particular, si no hay ciclos de costo negativo, decimos que un vrtice puede salir de la cola a lo
sumo |V| veces. Si sale ms veces, podemos detener el algoritmo, y anunciar que hemos
detectado un ciclo de costo negativo. El hecho de tener que contemplar que un vrtice pueda ser
procesado hasta |V| veces, determina que el costo del algoritmo sea O(|E||V|), ya que tendremos
que realizar |V| veces una operacin de costo O(|E|) (el descubrir los vrtices adyacentes al
vrtice siendo procesado). En la Lectura 9 observamos como se ejecuta este algoritmo sobre un
grafo ponderado con aristas negativas y positivas.
Materia: Algoritmos y Estructuras de Datos 2
Profesor: Claudio Ochoa

-9-

You might also like