Análise e Síntese de Algoritmos

Documentos relacionados
Eduardo Camponogara. DAS-9003: Introdução a Algoritmos

Análise e Síntese de Algoritmos

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford. O problema tem subestrutura óptima

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford

Caminhos mínimos de única origem

Grafos. Notas. Notas. Notas. Notas. Caminhos mais curtos de única origem. Subestrutura ótima. Propriedades de caminhos mais curtos

Análise e Síntese de Algoritmos. Algoritmos em Grafos CLRS, Cap. 22

Projeto e Análise de Algoritmos. Método Guloso

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

AULA 13 PROJETO E ANÁLISE DE ALGORITMOS. Problema do caminho mais curto de uma única origem em grafos Karina Valdivia Delgado

Análise e Síntese de Algoritmos

Otimização em Grafos

2006/2007 Análise e Síntese de Algoritmos 2

Grafos: caminhos mínimos

Análise e Síntese de Algoritmos. Fluxos Máximos em Grafos CLRS, Cap. 26

Análise e Síntese de Algoritmos. Programação Dinâmica CLRS, Cap. 15

Grafos. Exemplo de árvore geradora mínima. Notas. Notas. Notas. Notas. Árvores espalhadas mínimas. Como construir uma árvore geradora miníma

Análise e Síntese de Algoritmos. Problemas NP-Completos CLRS, Cap. 34

06 Grafos: Caminhos Mínimos SCC0503 Algoritmos e Estruturas de Dados II

Análise e Síntese de Algoritmos

Análise e Síntese de Algoritmos

Análise e Síntese de Algoritmos. Fluxos Máximos em Grafos CLRS, Cap. 26

Grafos: caminhos mínimos em Listas de Adjacência. Profa. Graça Nunes

Análise e Síntese de Algoritmos

INSTITUTO FEDERAL DO ESPÍRITO SANTO CURSO BACHARELADO EM SISTEMAS DE INFORMAÇÃO

Grafos. Notas. Notas. Notas. Notas. Caminhos mais curtos de todos os pares

Análise e Síntese de Algoritmos. Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25

Sub-grafo. Árvore Geradora Mínima

Distâncias Mínimas. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Distâncias Mínimas 2014/ / 27

Caminhos mínimos de todos os pares

O grau de saída d + (v) de um vértice v é o número de arcos que tem

Grafos e Algoritmos de Busca

Árvores Árvores Geradoras de Custo Mínimo 0/16

Análise e Síntese de Algoritmos

Projeto e Análise de Algoritmos

Otimização em Grafos

Algoritmos e Estruturas de Dados. Grafos Semestre de Inverno 13/14

Grafos parte 2. Percorrendo um grafo. Correção. Eficiência. Percorrendo um Grafo. Percorrendo um Grafo. Percorrendo um Grafo

Grafos Caminhos mais Curtos

INSTITUTO SUPERIOR TÉCNICO Análise e Síntese de Algoritmos. RESOLUÇÃO DO 2 o TESTE

Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade

Algoritmo Floyd-Warshall. Problema dos caminhos mínimos entre todos os pares. Programação dinâmica

II. Algoritmos sobre Grafos

PAA-DCC-UFAM. Grafos. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 7-10

Grafos Parte 2. SCC-603 Algoritmos e Estruturas de Dados II. Profª. Rosane Minghim / Baseado em material de professores dos anos anteriores

Grafos parte 2* Algoritmos e Estruturas de Dados II SCC-203 Rosane 2010/2011. *Baseado em material de professores dos anos anteriores

Algoritmo de Dijkstra (um para todos ; arestas de peso não negativo ; guloso)

Fluxo Máximo a Custo Mínimo

Grafos: árvores geradoras mínimas. Graça Nunes

Análise de Algoritmos

Algoritmos em Grafos: Caminho Mínimo

Projeto e Análise de Algoritmos

ESTRUTURAS DE DADOS. prof. Alexandre César Muniz de Oliveira. 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Ordenação 7. Busca 8.

Algoritmos de Caminho Mínimo Parte 1

ESTRUTURAS DISCRETAS (INF 1631) GRAFOS. 1. O que é um grafo? Defina um grafo orientado. Defina um grafo não-orientado.

Eduardo Camponogara. DAS-9003: Introdução a Algoritmos

Grafos COM11087-Tópicos Especiais em Programação II

Algoritmo de Dijkstra em LISP

Busca em Profundidade. Componentes Conexos. Grafos. Maria Adriana Vidigal de Lima. Fevereiro

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Melhores momentos AULA 3. Otimização Combinatória p. 102

Problemas de Fluxo em Redes

Estruturas de dados para conjuntos disjuntos. Estruturas de Dados para Conjuntos Disjuntos. Estruturas de dados para conjuntos disjuntos

Busca em Largura. Adaptado de Humberto C. B. Oliveira

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

apenas os caminhos que passam só por vértices em C, exceto, talvez, o próprio v A Figura 1 a seguir ilustra o significado do conjunto C edovalordist.

Grafos - Introdução. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Grafos - Introdução 2014/ / 32

Caminho Mínimo de Fonte Única em Grafos com Pesos Negativos Letícia Rodrigues Bueno

Melhores momentos AULA 15

DFS: Depth-First Search (pesquisa em profundidade) Percursos e Conectividade em Grafos Depth-First Search. Implementação de DFS

Grafos - Representação

Algoritmos de roteamento

grafo nós vértices arcos arestas

Teoria dos Grafos Aula 8

Cap. 2 Conceitos Básicos em Teoria dos Grafos

Complexidade de Algoritmos

Grafos Parte 1. Aleardo Manacero Jr.

Desafios de Programação TCC Turma A-1

Teoria dos Grafos Aula 8

Caminho Mínimo de Fonte Única em Grafos sem Pesos Negativos

Problema do Caminho Mínimo

Análise e Síntese de Algoritmos. Emparelhamento de Cadeias de Caracteres CLRS, Cap. 32

APOSTILA DE MÉTODO GULOSO

Algoritmo de Dijkstra Wikipédia, a enciclopédia livre

Caminho mais curto e o algoritmo de Dijkstra

Melhores momentos AULA 2. Otimização Combinatória p. 71

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 4, 6

Problema do Caminho Mais Curto. Problema do Caminho Mais Curto

Análise e Síntese de Algoritmos.

Projeto e Análise de Algoritmos Aula 8: Algoritmos Gulosos (5)

Unidade VI. Técnicas de Teste de Software Teste Estrutural. Profa. Dra. Sandra Fabbri

PROJETO E ANÁLISE DE ALGORITMOS (INF 2926)

GRAFOS Aula 07 Algoritmos de Caminho Mínimo: Bellman-Ford / Floyd-Warshall Max Pereira

Estruturas de Dados para Conjuntos Disjuntos. Estruturas de dados para conjuntos disjuntos

Análise de algoritmos

Algoritmos e Estruturas de Dados

Tecnicas Essencias Greedy e Dynamic

Transcrição:

Análise e Síntese de Algoritmos Caminhos Mais Curtos com Fonte Única [CLRS, Cap. 24] 2014/2015

Contexto Revisão [CLRS, Cap.1-13] Fundamentos; notação; exemplos Algoritmos em Grafos [CLRS, Cap.21-26] Algoritmos elementares Árvores abrangentes Caminhos mais curtos Fluxos máximos Programação Linear [CLRS, Cap.29] Algoritmos e modelação de problemas com restrições lineares Técnicas de Síntese de Algoritmos [CLRS, Cap.15-16] Programação dinâmica Algoritmos greedy Tópicos Adicionais [CLRS, Cap.32-35] Emparelhamento de Cadeias de Caracteres Complexidade Computacional Algoritmos de Aproximação

Resumo 1 Definições Caminhos Mais Curtos 2 Caminhos Mais Curtos com Fonte Única Representação de Caminhos Mais Curtos Propriedades dos Caminhos Mais Curtos Operação de Relaxação 3 Algoritmo Dijkstra 4 Algoritmo Bellman-Ford 5 Caminhos mais curtos em DAGs

Caminhos Mais Curtos Caminhos Mais Curtos Definições Dado um grafo G=(V,E), dirigido, com uma função de pesos w : E IR, define-se o peso de um caminho p, onde p=< v 0,v 1,...,v k >, como a soma dos pesos dos arcos que compõem p: w(p)= k i=1 w(v i 1,v i ) O peso do caminho mais curto de u para v é definido por: { min {w(p):u p v} se existe caminho de u para v δ(u,v)= caso contrário Um caminho mais curto de u para v é qualquer caminho p tal que w(p)=δ(u,v)

Caminhos Mais Curtos Caminhos Mais Curtos Problemas de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única (SSSPs) Identificar o caminho mais curto de um vértice fonte s V para qualquer outro vértice v V

Caminhos Mais Curtos Caminhos Mais Curtos Problemas de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única (SSSPs) Identificar o caminho mais curto de um vértice fonte s V para qualquer outro vértice v V Caminhos Mais Curtos com Destino Único Identificar o caminho mais curto de qualquer vértice v V para um vértice destino t V

Caminhos Mais Curtos Caminhos Mais Curtos Problemas de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única (SSSPs) Identificar o caminho mais curto de um vértice fonte s V para qualquer outro vértice v V Caminhos Mais Curtos com Destino Único Identificar o caminho mais curto de qualquer vértice v V para um vértice destino t V Caminho Mais Curto entre Par Único Identificar caminho mais curto entre dois vértices u e v

Caminhos Mais Curtos Caminhos Mais Curtos Problemas de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única (SSSPs) Identificar o caminho mais curto de um vértice fonte s V para qualquer outro vértice v V Caminhos Mais Curtos com Destino Único Identificar o caminho mais curto de qualquer vértice v V para um vértice destino t V Caminho Mais Curto entre Par Único Identificar caminho mais curto entre dois vértices u e v Caminhos Mais Curtos entre Todos os Pares (APSPs) Identificar um caminho mais curto entre cada par de vértices de V

Caminhos Mais Curtos Caminhos Mais Curtos Ciclos Negativos Arcos podem ter pesos com valor negativo É possível a existência de ciclos com peso total negativo Se ciclo negativo não atingível a partir da fonte s, então δ(s,v) bem definido Se ciclo negativo atingível a partir da fonte s, então os pesos dos caminhos mais curtos não são bem definidos Neste caso, é sempre possível encontrar um caminho mais curto de s para qualquer vértice incluído no ciclo e define-se δ(s,v)=

Caminhos Mais Curtos Caminhos Mais Curtos Ciclos Negativos Arcos podem ter pesos com valor negativo É possível a existência de ciclos com peso total negativo Se ciclo negativo não atingível a partir da fonte s, então δ(s,v) bem definido Se ciclo negativo atingível a partir da fonte s, então os pesos dos caminhos mais curtos não são bem definidos Neste caso, é sempre possível encontrar um caminho mais curto de s para qualquer vértice incluído no ciclo e define-se δ(s,v)= 2 3-2 s x y z -4 w(< s,x,y,z >)=3 w(< s,x,y,x,y,z >)=1 w(< s,x,y,x,y,x,y,z >)= 1...

Caminhos Mais Curtos Caminhos Mais Curtos Identificação de Ciclos Negativos Dijkstra: requer pesos não negativos Bellman-Ford: identifica ciclos negativos e reporta a sua existência

Representação de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única Representação de Caminhos Mais Curtos Para cada vértice v V associar predecessor π[v] Após identificação dos caminhos mais curtos, π[v] indica qual o vértice anterior a v num caminho mais curto de s para v Sub-grafo de predecessores G π =(V π,e π ): V π ={v V : π[v] NIL} {s} E π ={(π[v],v) E : v V π {s}}

Representação de Caminhos Mais Curtos Caminhos Mais Curtos com Fonte Única Representação de Caminhos Mais Curtos Uma árvore de caminhos mais curtos é um sub-grafo dirigido G =(V,E ), V V e E E, tal que: V é o conjunto de vértices atingíveis a partir de s em G G forma uma árvore com raiz s Para todo o v V, o único caminho de s para v em G é um caminho mais curto de s para v em G Observações: Após identificação dos caminhos mais curtos de G a partir de fonte s, G é dado por G π =(V π,e π ) Dados os mesmos grafo G e vértice fonte s, G não é necessariamente único

Propriedades dos Caminhos Mais Curtos Propriedades dos Caminhos Mais Curtos Sub-estrutura óptima Sub-caminhos de caminhos mais curtos são caminhos mais curtos Seja p=< v 1,v 2,...,v k > um caminho mais curto entre v 1 e v k, e seja p ij =< v i,v i+1,...,v j > um sub-caminho de p entre v i e v j. Então p ij é um caminho mais curto entre v i e v j Porquê? Se existisse caminho mais curto entre v i e v j então seria possível construir caminho entre v 1 e v k mais curto do que p; Contradição, dado que p é um caminho mais curto entre v 1 e v k. v k-1 v 1 v 2 v i v i+1 v j v k

Propriedades dos Caminhos Mais Curtos Propriedades dos Caminhos Mais Curtos Sub-estrutura óptima Sub-caminhos de caminhos mais curtos são caminhos mais curtos Seja p=< v 1,v 2,...,v k > um caminho mais curto entre v 1 e v k, e seja p ij =< v i,v i+1,...,v j > um sub-caminho de p entre v i e v j. Então p ij é um caminho mais curto entre v i e v j Porquê? Se existisse caminho mais curto entre v i e v j então seria possível construir caminho entre v 1 e v k mais curto do que p; Contradição, dado que p é um caminho mais curto entre v 1 e v k. Peso de um Caminho Mais Curto Seja p=< s,...,v > um caminho mais curto entre s e v, que pode ser decomposto em p su =< s,...,u > e (u,v). Então δ(s,v)=δ(s,u)+w(u,v) p su é caminho mais curto entre s e u δ(s,v)=w(p)=w(p su )+w(u,v)=δ(s,u)+w(u,v)

Propriedades dos Caminhos Mais Curtos Propriedades dos Caminhos Mais Curtos Relação caminho mais curto com arcos do grafo Para todos os arcos(u,v) E verifica-se δ(s,v) δ(s,u)+w(u,v) Caminho mais curto de s para v não pode ter mais peso do que qualquer outro caminho de s para v Assim, peso do caminho mais curto de s para v não superior ao peso do caminho mais curto de s para u seguido do arco(u,v) (i.e. exemplo de um dos caminhos de s para v)

Operação de Relaxação Operação de Relaxação Operação de Relaxação Operação básica dos algoritmos para cálculo dos caminhos mais curtos com fonte única. d[v]: denota a estimativa do caminho mais curto de s para v; limite superior no valor do peso do caminho mais curto; Algoritmos aplicam sequência de relaxações dos arcos de G após inicialização para actualizar a estimativa do caminho mais curto Initialize-Single-Source(G, s) 1 for each v V[G] 2 do d[v] 3 π[v] NIL 4 d[s] 0 Relax(u, v, w) 1 if d[v]>d[u]+w(u,v) 2 then d[v] d[u]+w(u,v) 3 π[v] u

Operação de Relaxação Propriedades da Relaxação Propriedades da Relaxação Após relaxar arco (u,v), temos que d[v] d[u]+w(u,v) Se d[v] > d[u] + w(u, v) antes da relaxação, então d[v]=d[u]+w(u,v) após relaxação Se d[v] d[u] + w(u, v) antes da relaxação, então d[v] d[u]+w(u,v) após relaxação Em qualquer caso, d[v] d[u] + w(u, v) após relaxação

Operação de Relaxação Propriedades da Relaxação (2) Propriedades da Relaxação d[v] δ(s, v) para qualquer v V[G] e para qualquer sequência de passos de relaxação nos arcos de G. Se d[v] atinge o valor δ(s,v), então o valor não é mais alterado d[v] δ(s, v) é válido após inicialização Prova por contradição para os restantes casos: Seja v o primeiro vértice para o qual a relaxação do arco(u,v) causa d[v]<δ(s,v) Após relaxar arco: d[u]+w(u,v)=d[v]<δ(s,v) δ(s,u)+w(u,v) Pelo que, d[u]<δ(s,u) antes da relaxação de(u,v); Contradição, dado que v seria o primeiro vértice para o qual d[v]<δ(s,v) Após ter d[v]=δ(s,v), o valor de d[v] não pode decrescer; e pela relaxação também não pode crescer!

Operação de Relaxação Propriedades da Relaxação (3) Propriedades da Relaxação Seja p =< s,..., u, v > um caminho mais curto em G, e seja Relax(u, v, w) executada no arco (u,v). Se d[u]=δ(s,u) antes da chamada a Relax(u, v, w), então d[v] = δ(s, v) após a chamada a Relax(u, v, w) Se d[u]=δ(s,u) então valor de d[u] não é mais alterado Após relaxar arco (u,v): d[v] d[u]+w(u,v)=δ(s,u)+w(u,v)=δ(s,v) Mas, d[v] δ(s,v), pelo que d[v]=δ(s,v), e não se altera!

Operação de Relaxação Resumo Propriedades Caminhos Mais Curtos Sub-estrutura óptima Sub-caminhos de caminhos mais curtos são caminhos mais curtos Seja p=< v 1,v 2,...,v k > um caminho mais curto entre v 1 e v k, e seja p ij =< v i,v i+1,...,v j > um sub-caminho de p entre v i e v j. Então p ij é um caminho mais curto entre v i e v j Sub-estrutura óptima Seja p=< s,...,v > um caminho mais curto entre s e v, que pode ser decomposto em p su =< s,...,u>e(u,v). Então δ(s,v)=δ(s,u)+w(u,v) Relação caminho mais curto com arcos do grafo Para todos os arcos(u,v) E verifica-se δ(s,v) δ(s,u)+w(u,v)

Operação de Relaxação Resumo Propriedades Operação Relaxação Propriedades da Relaxação Após relaxar arco (u,v), temos que d[v] d[u]+w(u,v) Propriedades da Relaxação (2) d[v] δ(s, v) para qualquer v V[G] e para qualquer sequência de passos de relaxação nos arcos de G. Se d[v] atinge o valor δ(s,v), então o valor não é mais alterado Propriedades da Relaxação (3) Seja p =< s,..., u, v > um caminho mais curto em G, e seja Relax(u, v, w) executada no arco (u,v). Se d[u]=δ(s,u) antes da chamada a Relax(u, v, w), então d[v] = δ(s, v) após a chamada a Relax(u, v, w)

Algoritmo de Dijkstra Organização do Algoritmo Todos os arcos com pesos não negativos Algoritmo Greedy Algoritmo mantém conjunto de vértices S com pesos dos caminhos mais curtos já calculados A cada passo algoritmo selecciona vértice u em V S com menor estimativa do peso do caminho mais curto vértice u é inserido em S arcos que saem de u são relaxados

Algoritmo de Dijkstra Dijkstra(G, w, s) 1 Initialize-Single-Source(G, s) 2 S /0 3 Q V[G] Fila de Prioridade 4 while Q /0 5 do u Extract-Min(Q) 6 S S {u} 7 for each v Adj[u] 8 do Relax(u, v, w) Actualização de Q

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra: Exemplo

Algoritmo de Dijkstra Complexidade Estrutura muito semelhante ao Algoritmo de Prim para cálculo de MST Fila de prioridade baseada em amontoados (heap) Quando um vértice é extraído da fila Q, implica actualização de Q Cada vértice é extraído apenas 1 vez O(V) Actualização de Q: O(lg V) Então, O(V lg V) Para cada arco (i.e. O(E)) operação de relaxação é aplicada apenas 1 vez. Cada operação de relaxação pode implicar uma actualização de Q em O(lg V) Complexidade algoritmo Dijkstra: O((V + E) lg V)

Algoritmo de Dijkstra Correcção do Algoritmo Provar invariante do algoritmo: d[u]=δ(s,u) quando u é adicionado ao conjunto S, e que a igualdade é posteriormente mantida Prova por contradição. Assume-se que existe um primeiro vértice u tal que d[u] δ(s,u) quando u é adicionado a S Necessariamente temos que u s porque d[s] = δ(s, s) = 0 S /0 porque s S quando u é adicionado a S Tem que existir caminho mais curto de s para u, dado que caso contrário teriamos d[u] = δ(s, u) =

Algoritmo de Dijkstra Correcção do Algoritmo (2) Pressuposto: u é o primeiro vértice tal que d[u] δ(s,u) quando u é adicionado a S Seja p=< s,...,x,y,...,u > o caminho mais curto de s para u Tem que existir pelo menos um vértice do caminho p que ainda não esteja em S, caso contrário, d[u]=δ(s,u) devido à relaxação dos arcos que compõem o caminho p

Algoritmo de Dijkstra Correcção do Algoritmo (2) Pressuposto: u é o primeiro vértice tal que d[u] δ(s,u) quando u é adicionado a S Seja p=< s,...,x,y,...,u > o caminho mais curto de s para u Tem que existir pelo menos um vértice do caminho p que ainda não esteja em S, caso contrário, d[u]=δ(s,u) devido à relaxação dos arcos que compõem o caminho p Seja (x,y) um arco de p tal que x S e y S Temos que d[x]=δ(s,x) porque x S e u é o primeiro vértice em que isso não ocorre Temos também que d[y]=δ(s,y) porque o arco(x,y) foi relaxado quando x foi adicionado a S Como y é predecessor de u no caminho mais curto até u, então δ(s,y) δ(s,u), porque os pesos dos arcos são não-negativos Mas se u é adicionado a S antes de y, temos que d[u] d[y]. Logo, d[u] δ(s, y) δ(s, u). O que contradiz o pressuposto de d[u] δ(s, u).

Algoritmo de Dijkstra Pesos Negativos no Grafo Os pesos do grafo têm que ser não-negativos para garantir a correcção do algoritmo Exemplo 6 s u 3-5 1 w v 1 Execução do Algoritmo Dijkstra: - Analisar w com d[w]=3 - Analisar v com d[v]=4 - Analisar u com d[u]=6 - No final temos que d[w]=3 δ(s,w)=2

Algoritmo de Bellman-Ford Organização do Algoritmo Permite pesos negativos e identifica existência de ciclos negativos Baseado em sequência de passos de relaxação Apenas requer manutenção da estimativa associada a cada vértice

Algoritmo de Bellman-Ford Bellman-Ford(G, w, s) 1 Initialize-Single-Source(G, s) 2 for i 1 to V[G] 1 3 do for each (u,v) E[G] 4 do Relax(u,v,w) 5 for each (u, v) E[G] 6 do if d[v]>d[u]+w(u,v) 7 then return FALSE Ciclo negativo 8 return TRUE Sem ciclos negativos

Algoritmo de Bellman-Ford: Exemplo

Algoritmo de Bellman-Ford: Exemplo

Algoritmo de Bellman-Ford: Exemplo

Algoritmo de Bellman-Ford: Outro exemplo

Algoritmo de Bellman-Ford: Outro exemplo

Algoritmo de Bellman-Ford Complexidade Inicialização: Θ(V) A complexidade do ciclofor é O(VE) devido aos dois ciclos, em V e em E. Em cada iteração todos os arcos são relaxados Complexidade algoritmo Bellman-Ford: O(VE)

Algoritmo de Bellman-Ford Correcção Se G=(V,E) não contém ciclos negativos, então após a aplicação do algoritmo de Bellman-Ford, d[v]=δ(s,v) para todos os vértices atingíveis a partir de s Seja v atingível a partir de s, e seja p=< v 0,v 1,...,v k > um caminho mais curto entre s e v, com v 0 = s e v k = v p é simples, pelo que k V 1 Prova: provar por indução que d[v i ]=δ(s,v i ) para i = 0,1,...,k, após iteração i sobre os arcos de G, e que valor não é alterado posteriormente Base: d[v 0 ]=δ(s,v 0 )=0 após inicialização (e não se altera) Passo indutivo: assumir d[v i 1 ]=δ(s,v i 1 ) após iteração (i-1) Arco (v i 1,v i ) relaxado na iteração i, pelo que d[v i ]=δ(s,v i ) após iteração i (e não se altera)

Algoritmo de Bellman-Ford Correcção (2) Se G=(V,E) não contém ciclos negativos, o algoritmo de Bellman-Ford retorna TRUE. Se o grafo contém algum ciclo negativo atingível a partir de s, o algoritmo retorna FALSE Se não existem ciclos negativos, resultado anterior assegura que para qualquer arco (u, v) E, d[v] d[u] + w(u, v), pelo que teste do algoritmo falha para todo o (u,v) e o valor retornado é TRUE Caso contrário, na presença de pelo menos um ciclo negativo atingível a partir de s, c =< v 0,v 1,...,v k >, onde v 0 = v k, temos que k i=1 w(v i 1,v i )<0

Algoritmo de Bellman-Ford Correcção (3) Se G=(V,E) não contém ciclos negativos, o algoritmo de Bellman-Ford retorna TRUE. Se o grafo contém algum ciclo negativo atingível a partir de s, o algoritmo retorna FALSE Prova por contradição. Admitir que algoritmo retorna TRUE na presença de ciclo negativo. Para que devolva TRUE é necessário que d[v i ] d[v i 1 ]+w(v i 1,v i ), para i = 1,...,k Somando as desigualdades ao longo do ciclo temos que: k i=1 d[v i ] k i=1 d[v i 1 ]+ k i=1 w(v i 1,v i ) Note-se que k i=1 d[v i]= k i=1 d[v i 1] por ser um ciclo Temos então que k i=1 w(v i 1,v i ) 0, o que contradiz a existência de um ciclo negativo. Logo, o algoritmo retorna FALSE

Caminhos mais curtos em DAGs DAG-Shortest-Path(G, w, s) 1 Ordenação topológica dos vértices de G 2 Initialize-Single-Source(G, s) 3 for each u V[G] por ordem topológica 4 do for each v Adj[u] 5 do Relax(u,v,w) Complexidade:

Caminhos mais curtos em DAGs DAG-Shortest-Path(G, w, s) 1 Ordenação topológica dos vértices de G 2 Initialize-Single-Source(G, s) 3 for each u V[G] por ordem topológica 4 do for each v Adj[u] 5 do Relax(u,v,w) Complexidade: O(V + E)

Caminhos mais curtos em DAGs Correcção Dado G=(V,E), dirigido, acíclico, como resultado do algoritmo, temos que d[v]=δ(s,v) para todo o v V Seja v atingível a partir de s, e seja p=< v 0,v 1,...,v k > um caminho mais curto entre s e v, com v 0 = s e v k = v Ordenação topológica implica que analisados por ordem (v 0,v 1 ), (v 1,v 2 ),...,(v k 1,v k ) Prova por indução: d[v i ]=δ(s,v i ) sempre que cada vértice v i é terminado Base: Estimativa de s não alterada após inicialização; d[s]=d[v 0 ]=δ(s,v 0 )=0 Indução: d[v i 1 ]=δ(s,v i 1 ) após terminar análise de v i 1 Relaxação do arco(v i 1,v i ) causa d[v i ]=δ(s,v i ), pelo que d[v i ]=δ(s,v i ) após terminar análise de v i

Caminhos mais curtos em DAGs Resumo Algoritmo Dijkstra Só permite pesos não negativos Complexidade: O((V + E) lg V) Algoritmo Bellman-Ford Permite pesos negativos e identifica ciclos negativos Complexidade: O(VE) Caminhos mais curtos em DAGs Grafos aciclicos. Podemos fazer ordenação topológica dos vértices Complexidade: O(V + E)