Projeto e Análise de Algoritmos Tarefa L12 Pg. 1 Prof. André Amaral 1. Uma etapa de relaxamento sobre uma aresta (u, v) é executada pelo código: RELAX(u, v, w) 1 if d[v] > d[v] + w(u, v) 2 then d[v] ← d[v] + w(u, v) 3 π[v] ← u Para demonstrar a correção do algoritmo de Dijkstra, do algoritmo de caminhos mais curtos para grafos acíclicos orientados, e do algoritmo de Bellman-Ford, recorreremos a várias propriedades de caminhos mais curtos e relaxamento. Para cada uma dessas propriedades abaixo, enunciar e apresentar uma prova formal. Note que as cinco últimas dessas propriedades, que se referem a estimativas de caminhos mais curtos ou ao subgrafo predecessor, supõem implicitamente que o grafo é inicializado com uma chamada a INlTIALIZE-SINGLE-SOURCE ( G, s) e que o único modo de modificar as estimativas de caminhos mais curtos e o subgrafo predecessor é empregar alguma seqüência de etapas de relaxamento. 1. Desigualdade de triângulos 2. Propriedade do limite superior 3. Propriedade de nenhum caminho 4. Propriedade de convergência 5. Propriedade de relaxamento de caminho 6. Propriedade de subgrafo predecessor 2. Dado um grafo orientado ponderado G = (V, E) , mostre que o algoritmo de Bellman-Ford resolve o problema de caminhos mais curtos de única origem no caso geral em que arestas podem ter peso negativo, retornando TRUE se o grafo G não contém nenhum ciclo de peso negativo acessível a partir da origem, e FALSE em caso contrário. 3. O algoritmo de Dijkstra resolve o problema de caminhos mais curtos de única origem em um grafo orientado ponderado G = (V, E) mas exige que os pesos de arestas sejam não negativos. Mostre que, com uma boa implementação, o algoritmo de Dijkstratem um tempo de execução menor que o do algoritmo de Bellman-Ford. Projeto e Análise de Algoritmos Tarefa L12 Pg. 2 Prof. André Amaral 4. Mostre como a pesquisa primeiro em profundidade pode ser usada para executar uma ordenação topológica (i.e., uma ordenação linear sobre os vértices) em um grafo acíclico orientado: GAO (ver Seção 22.4). 5. Mostre a correção do algoritmo de tempo linear (Seção 24.2, livro texto) para calcular caminhos mais curtos a partir de uma única origem em um GAO (grafo acíclico orientado) ponderado. Descreva a aplicação desse algoritmo na determinação de caminhos críticos na análise diagramas PERT. Execute DAG-SHORTEST-PATHS sobre o grafo orientado da Figura 24.5 do livro texto, usando o vértice r como origem. 6. Mostre como o algoritmo de Bellman-Ford pode ser usado para resolver um sistema de restrições de diferenças. 7. Prove o Corolário 24.3 do livro texto. 8. Dado um grafo orientado ponderado G = (V, E) sem ciclos de peso negativo, seja m o máximo sobre todos os pares de vértices u, v ∈ V do número mínimo de arestas em um caminho mais curto de u até v. (Aqui, o caminho mais curto é por peso, não pelo número de arestas.) Sugira uma mudança simples no algoritmo de Bellman-Ford que permita encerrá-lo em m + 1 passagens. 9. Modifique o algoritmo de Bellman-Ford de modo que ele defina d[v] como – ∞ para todos os vértices v para os quais existe um ciclo de peso negativo em algum caminho a partir da origem até v. 10. Seja G = (V, E) um grafo orientado ponderado com função peso w : E→ R. Forneça um algoritmo de tempo O(|V||E|) afim de encontrar, para cada vértice v em V, o valor δ*(v) = min u∈ V { δ(u, v) } . 11. Suponha que um grafo orientado ponderado G = (V, E) tenha um ciclo de peso negativo. Forneça um algoritmo eficiente para listar os vértices de um tal ciclo. Prove que seu algoritmo é correto. 12. Suponha que mudamos a linha 3 de DAG-PATHS para: 3 for os primeiros |V| – 1 vértices, tomados em seqüência ordenada topologicamente. Mostre que o procedimento continuaria sendo correto. Projeto e Análise de Algoritmos Tarefa L12 Pg. 3 Prof. André Amaral 13. A formulação de diagramas PERT dada anteriormente é um tanto antinatural. Seria mais natural que os vértices representassem serviços e arestas, restrições de sequenciamento; isto é, a aresta (u, v) indicaria que o serviço u deve ser executado antes do serviço v. Então, seriam atribuídos pesos a vértices, e não a arestas. Modifique o procedimento DAG-SHORTESTPATHS (Seção 24.2 do livro texto) de forma que ele encontre um caminho mais longo em um grafo acíclico orientado com vértices ponderados em tempo linear . 14. Forneça um algoritmo eficiente para contar o número total de caminhos em um grafo acíclico orientado. Analise seu algoritmo. 15. Pelo fato do algoritmo de Dijkstra sempre escolher o vértice "mais leve" ou "mais próximo" em V– S para adicionar ao conjunto S, dizemos que ele utiliza uma estratégia gulosa. Note que, as estratégias gulosas nem sempre produzem resultados ótimos em geral, mas, o algoritmo de Dijkstra realmente calcula caminhos mais curtos. Mostrar que se executarmos o algoritmo de Dijkstra sobre um grafo orientado ponderado G = (V, E) com função peso não negativa w e origem s, ele termina com d[u] = δ(s, u) para todos os vértices u ∈ V. 16. Explique o algoritmo de pesquisa primeiro na extensão (ver Seção 22.2 do livro texto). 17. Explique porque o algoritmo de Dijkstra é semelhante à pesquisa primeiro na extensão. 18. Explique porque o algoritmo de Dijkstra é semelhante ao algoritmo para calcular árvores de amplitude mínima de Prim . 19. Execute o algoritmo de Dijkstra sobre o grafo orientado da Figura 24.2 do livro texto, primeiro usando o vértice s como origem, e depois usando o vértice y como origem. No estilo da Figura 24.6 do livro texto, mostre os valores de d e pi e os vértices no conjunto S após cada iteração do loop while. 20. Forneça um exemplo simples de um grafo orientado com arestas de peso negativo para o qual o algoritmo de Dijkstra produza respostas incorretas. Por que a prova do Teorema 24.6 do livro texto não é válida quando são permitidas arestas de peso negativo? 21. Suponha que mudamos a linha 4 do algoritmo de Dijkstra para o seguinte: 4 while |Q| > 1 Essa mudança faz o loop while ser executado |V|– 1 vezes em lugar de |V| vezes. Esse algoritmo proposto é correto? Projeto e Análise de Algoritmos Tarefa L12 Pg. 4 Prof. André Amaral 22. Temos um grafo orientado G = (V, E) no qual cada aresta (u, v) em E tem um valor associado r(u, v), o qual é um número real no intervalo 0 ≤ r(u, v) ≤ 1 que representa a confiabilidade de um canal de comunicação do vértice u até o vértice v. Interpretamos r( u, v) como a probabilidade de que o canal de u até v não venha a falhar, e supomos que essas probabilidades são independentes. Forneça um algoritmo eficiente para encontrar o caminho mais confiável entre dois vértices dados. 23. Seja G = (V, E) um grafo orientado ponderado com função peso w : E → {1, 2, ..., W} para algum inteiro positivo W, e suponha que não existam dois vértices com os mesmos pesos de caminhos mais curtos a partir do vértice de origem s. Agora, suponha que definimos um grafo orientado não ponderado G' = (V ∪ V' , E') substituindo cada aresta (u, v) ∈ E por w(u, v) arestas de peso unitário em série. Quantos vértices G' tem? Suponha agora que executamos uma pesquisa primeiro na extensão sobre G' . Mostre que a ordem em que os vértices em V são coloridos de preto na pesquisa primeiro na extensão de G' é igual à ordem em que os vértices de V são extraídos da fila de prioridades na linha 5 de DIJKSTRA quando executado sobre G. 24. Seja G = (V, E) um grafo orientado ponderado com função peso w :E → {0,1, ..., W} para algum inteiro não negativo W. Modifique o algoritmo de Dijkstra para calcular os caminhos mais curtos a partir de um vértice de origem s dado no tempo O(W.|V| + |E|) 25. Modifique seu algoritmo do exercício anterior para ser executado no tempo O((|V| +|E|) lg |W| ). (Sugestão: Quantos valores de caminhos mais curtos distintos podem existir em V– S em qualquer instante?) 26. Suponha que temos um grafo orientado ponderado G = (V, E) em que as arestas que saem do vértice de origem s pode ter pesos negativos, todos os outros pesos de arestas são não negativos e não existe nenhum ciclo de peso negativo. Demonstre que o algoritmo de Dijkstra encontra corretamente caminhos mais curtos a partir de s nesse grafo. 27. Seja A.x ≤ b um sistema de m restrições de diferenças em n incógnitas. Mostre que o algoritmo de Bellman-Ford, quando é executado sobre o grafo de restrição correspondente, n maximiza ∑x i =1 i de acordo com A.x ≤ b e xi ≤ 0 para todo xi. 28. Mostre que o algoritmo de Bellman-Ford, quando executado sobre o grafo de restrição para um sistema A.x ≤ b de restrições de diferenças, minimiza a quantidade (max{ xi } – min{ xi } ) de acordo com A.x ≤ b. Explique como esse fato poderia ser útil se o algoritmo fosse usado para programar serviços de construção. Projeto e Análise de Algoritmos Tarefa L12 Pg. 5 Prof. André Amaral 29. Suponha que toda linha na matriz A de um programa linear A.x ≤ b corresponda a uma restrição de diferença, uma restrição de variável única da forma xi ≤ bk, ou a uma restrição de variável única da forma –xi ≤ bk. Mostre como o algoritmo de Bellman-Ford pode ser adaptado para resolver essa variedade de sistema de restrições. 30. Forneça um algoritmo eficiente para resolver um sistema A.x ≤ b de restrições de diferenças quando todos os elementos de b são valores reais e todas as incógnitas xi devem ser inteiros. 31. Forneça um algoritmo eficiente para resolver um sistema A.x ≤ b de restrições de diferenças quando todos os elementos de b são valores reais e um subconjunto especificado de algumas, mas não necessariamente todas, as incógnitas xi devem ser inteiros. 32. Uma caixa d dimensional com dimensões (x1,x2,...,xd) se aninha dentro de outra caixa com dimensões (y1,y2, ...,yd) se existe uma permutação π sobre {1, 2, ..., d} tal que xπ(1) < y1, xπ(2) <y2,..., xπ(d) <y d. a. Demonstre que a relação de aninhamento é transitiva. b. Descreva um método eficiente para determinar se uma caixa d dimensional se aninha ou não dentro de outra. c. Suponha que você tenha recebido um conjunto de n caixas d dimensionais {B1, B2, ..., Bn}. Descreva um algoritmo eficiente para determinar a mais longa seqüência Bi1 , Bi2 ,..., Bin de caixas tal que Bi j fique aninhada dentro de Bi j +1 para j = 1, 2, ..., k – l. Expresse o tempo de execução do seu algoritmo em termos de n e d.