Algoritmo de Johnson Estrutura de Dados II Lucas














- Slides: 14
Algoritmo de Johnson Estrutura de Dados II Lucas Ferreira Lucas Carvalho Nelson Plínio
Algoritmo de Johnson Foi criado em 1977 por Donald B. Johnson. O seu objetivo é encontrar o caminho mínimo para todos os vértices do grafo. Aplicado em grafos que são esparsos, direcionados e valorados. Permite que arestas tenham pesos negativos porém não pode existir um ciclo cujo a soma dos pesos seja negativo.
Procedimento: Adiciona um vértice e V arestas ao grafo, onde V = número de arestas Aplica o algoritmo de Bellman-Ford para cada vértice do grafo, utilizando o novo vértice como origem. Retira os vértices e arestas adicionados anteriormente e atualiza os pesos das arestas do grafo Aplica o algoritmo de Dijkstra em cada vértice do novo grafo.
Exemplo: -2 A 4 B -1 C -3 2 D F -4 1 E
1º Passo Verificar se existe algum ciclo negativo no grafo. -2 A 4 B 4 + (-1) + (-2) = 1 -1 C -3 2 D F -4 1 E
2º Passo Adicionar um novo vértice ao grafo e uma aresta para cada vértice do grafo. Estas arestas têm peso 0 devem sua origem deve ser o novo vértice. -2 A 0 B 0 4 -1 0 C 0 -3 2 D F -4 1 E X 0 0
3º Passo Aplicar o algoritmo de Bellman-Ford para cada um do vértices do grafo utilizando o novo vértice como fonte. 0 -2 A 0 B 0 4 -1 X→A 0 C 0 + (-1) + 4 = 3 0 -3 2 X 0 D F -4 1 E 0 0
3º Passo Aplicar o algoritmo de Bellman-Ford para cada um do vértices do grafo utilizando o novo vértice como fonte 0 -2 -2 A 0 B 0 4 -1 X→B 0 C 0 0 -3 2 X 0 + (-2) = -2 D F -4 1 E 0 0
3º Passo Aplicar o algoritmo de Bellman-Ford para cada um do vértices do grafo utilizando o novo vértice como fonte 0 -2 -2 A 0 B 0 4 -3 -1 0 C 0 -3 2 X -6 -1 D F 1 -4 0 E 0 0
4º Passo Retirar as arestas e vértices adicionados anteriormente. Atualizar o peso de cada aresta do grafo utilizando a fórmula: NP = PA + O - D NP = novo peso PA = peso atual O = origem D = destino 0 -2 -2 A 0 B 0 4 -3 -1 0 C 0 -3 2 X -6 -1 D F 1 -4 0 E 0 0
4º Passo Retirar as arestas e vértices adicionados anteriormente. Atualizar o peso de cada aresta do grafo utilizando a fórmula: NP = PA + O - D NP = novo peso PA = peso atual O = origem D = destino 0 -2 0 A -2 A → B: (-2) + 0 – (-2) = 0 B B → C: (-1) + (-2) – (-3) = 0 1 4 -3 C → A: 4 + (-3) – 0 = 1 -1 0 C → F: (-3) + (-3) – (-6) = 0 C -3 0 0 2 C → D: 2 + (-3) – (-1) = 0 -6 -1 D 2 1 F 0 E -4 2 E → D: 1 + 0 – (-1) = 2 E → F: (-4) + 0 – (-6) = 2
5º Passo Aplicar o algoritmo de Dijkstra para cada um dos vértices do novo grafo. 0 -2 0 A 1 B 0 -3 C 0 0 -6 -1 D F 2 0 E 2
Floyd Warshall VS Johnson Performance: Floyd Warshall Johnson O(v³) O(V*E) – Bellman-Ford O(E + V * log V) – Dijkstra
Obrigado !