Análise e Síntese de Algoritmos Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25 Contexto Algoritmos Elementares em Grafos (CLR, Cap. 22) BFS & DFS Ordenação Topológica & SCCs Árvores Abrangentes de Menor Custo (CLR, Cap. 23) Algoritmos de Borůva, Krusal e Prim Caminhos mais curtos com fonte única (CLR, Cap. 24) Algoritmos de Dstra e Bellman-Ford Caminhos mais curtos entre todos os pares (CLR, Cap. 25) Solução Recursiva, Algoritmos de Floyd-Warshall e Johnson 26/27 Análise e Síntese de Algoritmos 2 1
Resumo Caminhos Mais Curtos entre Todos os Pares (APSPs) Definições Soluções recursivas Algoritmo de Floyd-Warshall Fecho Transitivo Algoritmo de Johnson 26/27 Análise e Síntese de Algoritmos 3 Caminhos Mais Curtos entre Todos os Pares (APSPs) Observações Encontrar caminhos mais curtos entre todos os pares de vértices Se pesos não negativos Utilizar algoritmo de Dstra, assumindo cada vértice como fonte: O(V E lg V) (que é O(V 3 lg V) se grafo é denso) Se pesos negativos Utilizar algoritmo de Bellman-Ford, assumindo cada vértice como fonte: O(V 2 E) (que é O(V 4 ) se grafo é denso) Objectivo: Encontrar algoritmos mais eficientes 26/27 Análise e Síntese de Algoritmos 4 2
APSPs Definições Representação: utilização de matriz de adjacências Pesos dos arcos: matriz (n x n) W = (w ) w $ = # peso do arco (i, j) "' se i = j se i & se i & ( i, j) ( i, j) ( E % E Representação dos caminhos mais curtos: matriz (n x n) D = (d ) d é o peso do caminho mais curto entre os vértices i e j d = δ(v i,v j ) j e j e 26/27 Análise e Síntese de Algoritmos 5 APSPs Definições Representação de caminhos mais curtos Matriz de predecessores = (π ) π : NIL: se i = j ou não existe caminho de i para j Caso contrário: predecessor de j num caminho mais curto de i para j Sub-grafo de predecessores de G para i, G π, i = (V π, i, E π, i ) V { j $ V : # " NIL} {} i #, i = E {( #, j) : j " V {i}} #, i = #, i Sub-grafo induzido pela linha i de Exemplo 26/27 Análise e Síntese de Algoritmos 6 3
APSPs Solução Recursiva Sub-caminhos de caminhos mais curtos são também caminhos mais curtos Peso mínimo em caminho de vértice i para vértice j (m) que contém não mais do que m arcos: d Com m =, existe caminho de i para j se e só se i = j # se i = j d = " % se i $ j Para m 1, ( m 1) { { + w j } = min{ di w j } ( m) ( m 1) ( m 1) = min d,min di 1" " n d + 1" " n w jj = 26/27 Análise e Síntese de Algoritmos 7 APSPs Solução Recursiva Calcular sequência de matrizes D (1),, D (n-1), onde D (n-1) contém os pesos dos caminhos mais curtos D (1) = W Extend-Shortest-Paths(D,W) n = rows[w] D : matriz (n x n) for i = 1 to n for j = 1 to n d' = for = 1 to n ' ' d = min d,di + return D ( w ) Complexidade: Θ(n 3 ) p/ cada matriz; Total: Θ(n 4 ) 26/27 Análise e Síntese de Algoritmos 8 j 4
APSPs Solução Recursiva Genericamente: calcular D (i) em função de D (i-1) (e de W) Complexidade para cálculo de D (n) : Θ(n 4 ) OBS: é possível melhorar complexidade reduzindo número de matrizes calculadas: Θ(n 3 lg n) A cada iteração, calcular D (2i) em função de D (i) e de D (i) 26/27 Análise e Síntese de Algoritmos 9 APSPs Algoritmo de Floyd-Warshall Caracterização de um caminho mais curto Vértices intermédios de caminho p = v 1,v 2,,v, {v 2,,v -1 } Considerar todos os caminhos entre i e j com vértices intermédios retirados do conjunto {1,,} e seja p um caminho mais curto (p é simples) Se não é vértice intermédio de p, então todos os vértices intermédios de p estão em {1,,-1} Se é vértice intermédio de p, então existem caminhos p 1 e p 2, respectivamente de i para e de para j com vértices intermédios em {1,,} não é vértice intermédio de p 1 e de p 2 p 1 e p 2 com vértices intermédios em {1,,-1} 26/27 Análise e Síntese de Algoritmos 1 5
APSPs Algoritmo de Floyd-Warshall i p 1 p 2 j Formulação Vértices entre 1 e -1 # w d = " ( % 1) ( % 1) ( % 1) min d,di + dj se = se $ 1 Vértices entre 1 e 26/27 Análise e Síntese de Algoritmos 11 APSPs Algoritmo de Floyd-Warshall Floyd-Warshall(W) n = rows[w] D () = W for = 1 to n for i = 1 to n for j = 1 to n d return D (n) = min ( 1) ( 1) ( 1) d,di + dj Complexidade: Θ(n 3 ) Exemplo 26/27 Análise e Síntese de Algoritmos 12 6
Fecho Transitivo de um Grafo Dirigido Dado um grafo G = (V, E) dirigido, o fecho transitivo é definido por G* = (V, E*) tal que, E*={(i, j): existe caminho de i para j em G} Algoritmo: Atribuir a cada arco peso 1 e utilizar algoritmo de Floyd- Warshall Se d, então (i, j) E* Complexidade: Θ(n 3 ) 26/27 Análise e Síntese de Algoritmos 13 Fecho Transitivo de um Grafo Dirigido Outro algoritmo: Substituir operações min e + por e, respectivamente Se existe caminho de i para j com todos os vértices intermédios em {1,2,,}, t = 1 Caso contrário, t = Formulação: # se i & j e ( i, j) = " 1 se i = j ou ( i, j) t % E $ E t 1 ( $ 1) ( $ 1) ( $ 1) = t # ti " tj se Complexidade: Θ(n 3 ) (mas constantes menores) Exemplo 26/27 Análise e Síntese de Algoritmos 14 7
Fecho Transitivo de um Grafo Dirigido Transitive-Closure(G) n = V[G] for i = 1 to n for j = 1 to n if i = j or (i, j) E t = 1 else t = for = 1 to n for i = 1 to n for j = 1 to n 1 t return T (n) = t ( 1) ( 1) # ti " tj 26/27 Análise e Síntese de Algoritmos 15 APSPs Algoritmo de Johnson Utiliza algoritmos de Dstra e de Bellman-Ford Baseado em re-pesagem dos arcos Se arcos com pesos não negativos, utilizar Dstra para cada vértice Caso contrário, calcular novo conjunto de pesos não negativos w, tal que Um caminho mais curto de u para v com função w é também caminho mais curto com função w Para cada arco (u, v) o peso w (u, v) é não negativo 26/27 Análise e Síntese de Algoritmos 16 8
APSPs Algoritmo de Johnson Dado G = (V, E), com função de pesos w e de repesagem h: V R, seja w (u, v) = w(u, v) + h(u) - h(v) Seja p = v,v 1,,v. Então w(p) = δ(v, v ) se e só se w (p) = δ (v, v ) = δ(v, v ) + h(v ) - h(v ) Existe ciclo negativo com w se e só se existe ciclo negativo com w ( p) = w( p) + h( v ) h w ' w' v ( p) = " w' ( v i 1,v i) = = i= 1 "( w( v i 1,v i) + h( vi 1) h( vi ) i= 1 " w ( v,v ) + h( v ) h( v ) = w( p) + h( v ) h( v ) i 1 i i= 1 26/27 Análise e Síntese de Algoritmos 17 APSPs Algoritmo de Johnson ( p) = ( v,v ) " w' ( p) = '( v, ) w v Hipótese: existe p z, caminho mais curto de v para v com w w' p z < w' p Então: ( p ) + h( v ) h( v ) = w' ( p ) < w' ( p) = w( p) + h( v ) h( v ) w z z O que implica ( p ) w( p) w z < Mas p é caminho mais curto com w; contradição OBS: Para quaisquer caminhos p 1, p 2 entre v e v, verifica-se w(p 1 ) < w(p 2 ) w (p 1 ) < w (p 2 ) 26/27 Análise e Síntese de Algoritmos 18 9
APSPs Algoritmo de Johnson ( p) = ( v,v ) " w' ( p) = '( v, ) w v Semelhante: Admitir p z como caminho mais curto de v para v com w (ou considerar observação anterior) Existe ciclo negativo com w se e só se existe com w w' c = " v,v1, K,v ; v = v; w c < ( c) = w( c) + h( v ) h( v ) w( c) = Caminhos mais curtos e ciclos negativos inalteráveis com mudanças na função de pesos w (u, v) = w(u, v) + h(u) - h(v) 26/27 Análise e Síntese de Algoritmos 19 APSPs Algoritmo de Johnson Dado G = (V, E), criar G = (V,E ): V = V { s } E = E { (s, v) : v V } ( v V, atingível a partir de s) w(s, v) = Com ciclos negativos: Detectados com algoritmo de Bellman-Ford aplicado a G Sem ciclos negativos: Definir: h(v) = δ(s, v) Dado que: h(v) h(u) + w(u, v) Verifica-se: w (u, v) = w(u, v) + h(u) - h(v) 24.1 26/27 Análise e Síntese de Algoritmos 2 1
APSPs Algoritmo de Johnson Executar Dstra para todo o u V Cálculo de δ (u,v), para u V Mas também, δ (u,v) = δ(u, v) + h(u) - h(v) δ(u,v) = δ (u, v) + h(v) - h(u) 26/27 Análise e Síntese de Algoritmos 21 APSPs Algoritmo de Johnson Johnson(G) Representar G if Bellman-Ford(G,w,s) = FALSE print Indicar ciclo negativo else atribuir h(v) = δ(s, v), calculado com Bellman-Ford calcular w (u,v) = w(u,v) + h(u) - h(v) para cada arco (u,v) foreach v V[G] executar Dstra(G,w,v); calcular δ (u, v) d uv = δ (u, v) + h(v) - h(u) return D 26/27 Análise e Síntese de Algoritmos 22 11
APSPs Algoritmo de Johnson Complexidade: Bellman-Ford: O(V E) Executar Dstra para cada vértice: O(V (V + E) lg V) Assumindo amontoado (heap) binário Total: O(V (V + E) lg V) Útil para grafos esparsos Exemplo 26/27 Análise e Síntese de Algoritmos 23 Revisão Caminhos Mais Curtos entre Todos os Pares (APSPs) Definições Solução recursiva Algoritmo de Floyd-Warshall Fecho Transitivo Algoritmo de Johnson A seguir: Fluxos máximos em grafos (CLR, Cap. 26) 26/27 Análise e Síntese de Algoritmos 24 12