Algoritmo de Johnson Estrutura de Dados II Lucas

  • Slides: 14
Download presentation
Algoritmo de Johnson Estrutura de Dados II Lucas Ferreira Lucas Carvalho Nelson Plínio

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

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

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

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

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

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

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

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

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

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

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

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 +

Floyd Warshall VS Johnson Performance: Floyd Warshall Johnson O(v³) O(V*E) – Bellman-Ford O(E + V * log V) – Dijkstra

Obrigado !

Obrigado !