Menor Caminho com Origem Única Menor Caminho de Origem Única Problema: encontrar o caminho, mai crto poíel, entre Campina Grande e Natal. Sponha qe temo m mapa com toda a etrada do Nordete, com a ditância entre todo o pare de cidade adjacente. Como determinar a menor ditância entre a da cidade? Uma maneira de reoler ete problema é encontrar a menor ditância entre Campina Grande e toda a otra cidade do Nordete. Em grafo: Menor Caminho com Origem Única Menor Caminho com Origem Única Menor Caminho com Origem Única Conideramo m grafo dirigido G = (V, E), com ma fnção peo w(, ): ): E R, R, qe mapeia peo a areta. O peo do do caminho p = < <,,,,, k k > é a oma do peo da areta qe o contitem: w(p) = kk i= w( i= i- i-,, w i ) i Definimo o menor caminho entre e como: δ(, ) ) = min{w(p): }, }, e e eitir m caminho. δ(, ) ) =,, e e não eitir caminho. O problema de de menor caminho em m grafo conite em determinar o menor caminho entre m értice inicial V e todo o odemai értice de de V. V. Algma ariaçõe do do problema: Menor caminho com detino único. Menor caminho entre m par de de értice. Menor caminho entre todo o opare de de értice. Em algma intância é poíel encontrar peo negatio. Eemplo de Menor Caminho Eemplo de Menor Caminho
Eemplo de Menor Caminho Algoritmo de Dijktra Amir qe qalqer cidade é infinitamente ditante da da cidade origem: Abordagem otimita: Sempre qe chegar em ma cidade, amir qe encontro o menor caminho. Se depoi encontra algo melhor, ataliar o o dado. A partir da da cidade de de origem, iitar primeiro a a cidade adjacente, depoi a a adjacente da adjacente, e aim por diante. Algoritmo batante conhecido, tiliado no no OSPF. Algoritmo de Dijktra Algoritmo de Dijktra Não conidera peo negatio. Uo de de da ariáei ailiare: d[] (etimatia de de menor ditância) π[] (predeceor) Ataliação do dado tilia a técnica de de relaamento. IniciaMenorCaminho(G, ) for V[G] do d[] π[] NIL d[] Relaa(,, w) if d[] > d[] + w(,) then d[] d[] + w(,) π[] Algoritmo de Dijktra Eecção do Algoritmo de Dijktra Dijktra(G, w, ) IniciaMenorCaminho(G, ) S Ø Q V[G] while Q Ø do EtraiMenor[Q] S S {} for Adj[] do Relaa(,, w) Q:
Eecção do Algoritmo de Dijktra Eecção do Algoritmo de Dijktra Q: Q: Eecção do Algoritmo de Dijktra Eecção do Algoritmo de Dijktra Q: Q: Eecção do Algoritmo de Dijktra Eecção do Algoritmo de Dijktra Q: Q:
Eecção do Algoritmo de Dijktra Eecção do Algoritmo de Dijktra Q: Q: Ø Algoritmo Bellman-Ford Algoritmo de Bellman-Ford Reole menor caminho de de forma mai genérica, inclindo peo negatio. Verifica a eitência de de ciclo de de peo negatio: Se eitir, indica qe não é poíel achar menor caminho. Também tilia a técnica de de relaamento de de areta. A idéia principal: progreiamente ir ir diminindo a etimatia de de ditância até encontrar o menor caminho. Bellman-Ford(G, w, ) IniciaMenorCaminho(G, ) for i to V[G] - do for (, ) E[G] do Relaa(,, w) for (, ) E[G] do if d[] > d[] + w(, ) then retrn FALSE retrn TRUE Eecção do Algoritmo de Bellman-Ford Eecção do Algoritmo de Bellman-Ford - - - - - -,,,,,,,,,,,,,,,,,,
Eecção do Algoritmo de Bellman-Ford Eecção do Algoritmo de Bellman-Ford - - - - - -,,,,,,,,,,,,,,,,,, Reltado Apó Primeira Paada Reltado Apó Segnda Paada - - - - - -,,,,,,,,,,,,,,,,,, Reltado Apó Terceira Paada Reltado Apó Qarta Paada - - - - - - -,,,,,,,,,,,,,,,,,,
Reltado Final Algoritmo de Flod-Warhall TRUE: aência de ciclo negatio - - - - Calcla a menor ditância entre todo o pare de értice. Conidera ma matri n n e tilia a técnica de programação dinâmica. Seja A[i,j] = c[i,j] i,j i,j & i j. Se (i,j) não é ma areta, faer A[i,j]= e A[i,i]= A k [i,j] = min (A k- k- [i,j],, A k- k- [i,k]+ A k- k- [k,j]),,,,,,,,, Algoritmo de Flod-Warhall Flod-Warhall(G, w) Iniciar A[i,j] = w[i,j] Iniciar A[i,i] = for k to n do for i to n do for j to n do if A[i,j] > A[i,k] + A[k,j] then A[i,j] = A[j,k] + A[k,j]