250 likes | 481 Views
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ůvka, Kruskal e Prim
E N D
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ůvka, Kruskal e Prim • Caminhos mais curtos com fonte única (CLR, Cap. 24) • Algoritmos de Dijkstra e Bellman-Ford • Caminhos mais curtos entre todos os pares (CLR, Cap. 25) • Solução Recursiva e Algoritmo de Floyd-Warshall Análise e Síntese de Algoritmos
Resumo • Caminhos Mais Curtos entre Todos os Pares (APSPs) • Definições • Soluções recursivas • Algoritmo de Floyd-Warshall • Fecho Transitivo • Algoritmo de Johnson Análise e Síntese de Algoritmos
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 Dijkstra, assumindo cada vértice como fonte: O(V E lg V) (que é O(V3 lg V) se grafo é denso) • Se pesos negativos • Utilizar algoritmo de Bellman-Ford, assumindo cada vértice como fonte: O(V2E) (que é O(V4) se grafo é denso) • Objectivo: Encontrar algoritmos mais eficientes Análise e Síntese de Algoritmos
APSPs — Definições • Representação: utilização de matriz de adjacências • Pesos dos arcos: matriz (n x n) W = (wij) • Representação dos caminhos mais curtos: matriz (n x n) D = (dij) • dij é o peso do caminho mais curto entre os vértices i e j • dij = (vi,vj) Análise e Síntese de Algoritmos
APSPs — Definições • Representação de caminhos mais curtos • Matriz de predecessores = (ij) • ij: • 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) • Sub-grafo induzido pela linha i de • Exemplo Análise e Síntese de Algoritmos
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 que contém não mais do que m arcos: • Com m = 0, existe caminho de i para j se e só se i = j • Para m 1, wjj = 0 Análise e Síntese de Algoritmos
Extend-Shortest-Paths(D,W) n = rows[W] D’: matriz (n x n) for i = 1 to n for j = 1 to n for k = 1 to n return D’ 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 • Complexidade: (n3) p/ cada matriz; Total: (n4) Análise e Síntese de Algoritmos
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): (n4) • OBS: é possível melhorar complexidade reduzindo número de matrizes calculadas: (n3lg n) • A cada iteração, calcular D(2i) em função de D(i) e de D(i) • Exemplo Análise e Síntese de Algoritmos
APSPs — Algoritmo de Floyd-Warshall • Caracterização de um caminho mais curto • Vértices intermédios de caminho p = v1,v2,,vk, {v2,,vk-1} • Considerar todos os caminhos entre i e j com vértices intermédios retirados do conjunto {1,,k} e seja p um caminho mais curto (p é simples) • Se k não é vértice intermédio de p, então todos os vértices intermédios de p estão em {1,,k-1} • Se k é vértice intermédio de p, então existem caminhos p1 e p2, respectivamente de i para k e de k para j com vértices intermédios em {1,,k} • k não é vértice intermédio de p1 e de p2 • p1 e p2 com vértices intermédios em {1,,k-1} Análise e Síntese de Algoritmos
p2 k p1 i j APSPs — Algoritmo de Floyd-Warshall • Formulação Vértices entre 1 e k-1 Vértices entre 1 e k Análise e Síntese de Algoritmos
APSPs — Algoritmo de Floyd-Warshall • Complexidade: (n3) • Exemplo Floyd-Warshall(W) n = rows[W] D(0) = W for k = 1 to n for i = 1 to n for j = 1 to n return D(n) Análise e Síntese de Algoritmos
Fecho Transitivo de um Grafo Dirigido • Dado um grafo G = (V, E) dirigido, o fecho transitivo é definido por G* = (V, E*) tal que, • Aplicação: autorizações de acesso • Algoritmo: • Atribuir a cada arco peso 1 e utilizar algoritmo de Floyd-Warshall • Se dij , então (i, j) E* • Complexidade: (n3) Análise e Síntese de Algoritmos
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,…,k}, • Caso contrário, • Formulação: • Complexidade: (n3) (mas constantes menores) • Exemplo Análise e Síntese de Algoritmos
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 else for k = 1 to n for i = 1 to n for j = 1 to n return T(n) Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson • Utiliza algoritmos de Dijkstra e de Bellman-Ford • Baseado em re-pesagem dos arcos • Se arcos com pesos não negativos, utilizar Dijkstra 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 Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson • Dado G = (V, E), com função de pesos w e de re-pesagem h: V R, seja w’(u, v) = w(u, v) + h(u) - h(v) • Seja p = v0,v1,,vk. Então w(p) = (v0, vk) se e só se w’(p) = ’(v0, vk) = (v0, vk) + h(v0) - h(vk) • Existe ciclo negativo com w se e só se existe ciclo negativo com w’ Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson Hipótese: existe pz, caminho mais curto de v0 para vk com w’ Então: O que implica Mas p é caminho mais curto com w; contradição ! OBS: Para quaisquer caminhos p1, p2 entre v0 e vk, verifica-se w(p1) < w(p2) w’(p1) < w’(p2) Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson Semelhante: Admitir pz como caminho mais curto de v0 para vk com w (ou considerar observação anterior) Existe ciclo negativo com w se e só se existe com w’ 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) Análise e Síntese de Algoritmos
24.10 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) = 0 • 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) 0! Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson • Executar Dijkstra 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) Análise e Síntese de Algoritmos
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 Dijkstra(G,w’,u); calcular ’(u, v) duv = ’(u, v) + h(v) - h(u) return D Análise e Síntese de Algoritmos
APSPs — Algoritmo de Johnson • Complexidade: • Bellman-Ford: O(V E) • Executar Dijkstra 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 Análise e Síntese de Algoritmos
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) Análise e Síntese de Algoritmos