CI2613: Algoritmos y Estructuras III Caminos de costo mı́nimo en grafos Blai Bonet Algoritmo de Johnson Universidad Simón Bolı́var, Caracas, Venezuela Enero-Marzo 2015 c 2014 Blai Bonet Caminos entre todos los pares de vértices CI2613 Caminos entre todos los pares de vértices El algoritmo de Floyd-Warshall calcula las distancias y caminos más cortos entre todos los pares de vértices en tiempo Θ(V 3 ) El algoritmo de Johnson utiliza la técnica de cambio de pesos: – Si todos las aristas tienen costos no negativos, se corre Dijkstra desde cada vértice s utilizando un heap de Fibonacci 2 ), En grafos densos, donde E = Ω(V Floyd-Warshall es asintóticamente el mejor algoritmo conocido – Si existen costos negativos pero no ciclos de costo negativo, se calculan nuevo pesos no negativos ŵ y volvemos al caso anterior En grafos dispersos, donde E = o(V 2 ), existen mejores algoritmos: Los nuevos pesos ŵ deben satisfacer: – Si los costos son no-negativos, podemos correr Dijkstra V veces en tiempo O(V 2 log V + V E) para obtener un mejor algoritmo 1 – El algoritmo de Johnson obtiene el mismo tiempo de corrida O(V 2 log V + V E) pero sin restricción en los pesos. Si existe un ciclo de costo negativo, el algoritmo reporta su existencia y termina Para todo par de vértices u, v ∈ V : p es un mejor camino de u a v con respecto a w si y sólo si p es un mejor camino de u a v con respecto a ŵ 2 Para todas las aristas (u, v) ∈ E: ŵ(u, v) ≥ 0 c 2014 Blai Bonet CI2613 c 2014 Blai Bonet CI2613 Cambio de peso: Repesaje Cambio de peso: Repesaje Prueba del Lema: Sea p = (v0 , . . . , vk ) con v0 = u y vk = v El repesaje de w : E → R lo hacemos con una función h : V → R que mapea vértices en valores Primero mostramos ŵ(p) = w(p) + h(u) − h(v): El repesaje de w es ŵ : E → R defnida por ŵ(u, v) = w(u, v) + h(u) − h(v) ŵ(p) = Pk = Pk = Pk i=1 ŵ(vi−1 , vi ) w(vi−1 , vi ) + h(vi−1 ) − h(vi ) Pk i=1 h(vi−1 ) − h(vi ) i=1 w(vi−1 , vi ) + i=1 Lema = w(p) + h(v0 ) − h(vk ) Sea G = (V, E) un digrafo con pesos w : E → R. Considere el repesaje ŵ : E → R. Sea p un camino de u a v en G. Entonces, p es un camino más corto con respecto a w si y sólo si p es un camino más corto con respecto a ŵ. = w(p) + h(u) − h(v) Como h(u) y h(v) no dependen de p, p es óptimo relativo a w si y sólo si p es óptimo relativo a ŵ También, G tiene un costo de ciclo negativo con respecto a w si y sólo si G tiene un ciclo de costo negativo con respecto a ŵ. Si c = (v0 , . . . , vk ) es un ciclo con v0 = vk , Claramente, el Lema garantiza la propiedad Por lo tanto, w(c) < 0 si y sólo si ŵ(c) < 0 ŵ(c) = w(c) + h(v0 ) − h(vk ) = w(c) 1 c 2014 Blai Bonet CI2613 c 2014 Blai Bonet Pesos no negativos Propiedad 2 CI2613 Pesos no negativos Considere h : V → R dada por h(u) = δ 0 (s, u) : ŵ(u, v) ≥ 0 para toda arista (u, v) ∈ E Por la desigualdad triangular en G0 , para arista (u, v) ∈ E: Dado digrafo G = (V, E), aumentamos G con un vértice fuente s: G0 = (V 0 , E 0 ) donde V 0 = V ∪ {s} y E 0 = E ∪ {(s, u) : u ∈ V } δ 0 (s, v) ≤ δ 0 (s, u) + w0 (u, v) =⇒ δ 0 (s, u) − δ 0 (s, v) ≥ −w0 (u, v) Los pesos también son extendidos: w(u, v) si (u, v) ∈ E 0 w (u, v) = 0 si (u, v) = (s, v) con v ∈ V Por lo tanto, para arista (u, v) ∈ E, ŵ(u, v) = w(u, v) + h(u) − h(v) = w0 (u, v) + δ 0 (s, u) − δ 0 (s, v) ≥ w0 (u, v) − w0 (u, v) Observación: G tiene un ciclo de costo negativo si y sólo si G0 tiene un ciclo de costo negativo alcanzable desde s c 2014 Blai Bonet = 0 CI2613 c 2014 Blai Bonet CI2613 Algoritmo de Johnson Algoritmo de Johnson: Ejemplo 1. Dado un digrafo G = (V, E), se construye el digrafo aumentado G0 = (V 0 , E 0 ) con pesos w0 : E 0 → R [Tiempo: O(V + E)] v1 δ 0 (s, u) 2. Correr Bellman-Ford para calcular las distancias en el digrafo G0 para u ∈ V [Tiempo: O(V 0 E 0 ) = O(V E + V 2 )] 3 4 v5 3. Calcular repesaje ŵ : E → R relativo a h(u) = δ 0 (s, u) para u ∈ V 8 2 [Tiempo: O(E)] v2 −5 −4 7 4. Corremos el algoritmo de Dijkstra |V | veces desde todos los vértices s ∈ V [Tiempo: O(V 2 log V + V E)] 1 v3 6 v4 5. Distancias finales: δ(u, v) = δ̂(u, v) − h(u) + h(v) [Tiempo: O(V 2 )] Digrafo G = (V, E) c 2014 Blai Bonet CI2613 c 2014 Blai Bonet CI2613 Algoritmo de Johnson: Ejemplo Algoritmo de Johnson: Ejemplo 0 0 v1 0 3 4 3 v5 v0 v0 8 2 0 0 −5 7 6 −5 7 v3 −4 0 v4 v2 −4 0 1 −5 8 2 Digrafo aumentado G0 = (V 0 , E 0 ) c 2014 Blai Bonet 0 v2 −4 0 4 v5 0 0 −1 v1 0 1 6 0 v3 v4 Después de correr Bellman-Ford desde v0 CI2613 c 2014 Blai Bonet CI2613 Algoritmo de Johnson: Ejemplo Algoritmo de Johnson: Ejemplo 5 v1 1 4 v1 0 4 v5 v0 0 13 2 0 10 0 10 v3 0 v3 2 v4 v4 Repesaje de aristas Repesaje de aristas sobre grafo original c 2014 Blai Bonet CI2613 c 2014 Blai Bonet Algoritmo de Johnson: Ejemplo 0 4 CI2613 Algoritmo de Johnson: Ejemplo v1 0 0 4 v5 v1 0 v5 2 0 13 2 2 0 10 2 2 0 v2 0 0 0 10 v3 2 v4 0 13 2 v2 0 0 2 0 v3 v4 Después de correr Dijkstra desde el vértice v1 c 2014 Blai Bonet v2 0 0 2 0 13 2 v2 0 4 0 v5 Después de correr Dijkstra desde el vértice v2 CI2613 c 2014 Blai Bonet CI2613 Algoritmo de Johnson: Ejemplo 0 Algoritmo de Johnson: Ejemplo v1 4 2 0 4 v5 0 v5 2 0 13 2 4 0 10 2 v3 0 v4 0 2 2 v3 v4 Después de correr Dijkstra desde el vértice v3 Después de correr Dijkstra desde el vértice v4 c 2014 Blai Bonet CI2613 Algoritmo de Johnson: Ejemplo 2 4 v1 0 v5 0 2 13 2 v2 0 0 10 0 0 10 0 2 v2 0 0 2 13 2 v2 0 0 2 2 v3 v4 Después de correr Dijkstra desde el vértice v5 c 2014 Blai Bonet v1 CI2613 c 2014 Blai Bonet CI2613