Algoritmos e complexidade Notas de aula - Arquivo Escolar

Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar

arquivoescolar.org
from arquivoescolar.org More from this publisher
13.04.2013 Views

9. Algoritmos em grafos Figura 9.1.: Grafo (esquerda) com circulação (direita) 9.1. Fluxos em redes Definição 9.1 Para um grafo direcionado G = (V, E) (E ⊆ V × V ) escrevemos δ + (v) = {(v, u) | (v, u) ∈ E} para os arcos saintes de v e δ − (v) = {(u, v) | (u, v) ∈ E} para os arcos entrantes em v. Seja G = (V, E, c) um grafo direcionado e capacitado com capacidades c : E → R nos arcos. Uma atribuição de fluxos aos arcos f : E → R em G se chama circulação, se os fluxos respeitam os limites da capacidade (fe ≤ ce) e satisfazem a conservação do fluxo f(v) := fe − fe = 0 (9.1) (ver Fig. 9.1). e∈δ + (v) e∈δ − (v) Lema 9.1 Qualquer atribuição de fluxos f satisfaz v∈V f(v) = 0. Prova. 198 f(v) = v∈V v∈V e∈δ + (v) = (v,u)∈E fe − e∈δ − (v) f (v,u) − (u,v)∈E fe f (u,v) = 0

9.1. Fluxos em redes A circulação vira um fluxo, se o grafo possui alguns vértices que são fontes ou destinos de fluxo, e portanto não satisfazem a conservação de fluxo. Um fluxo s–t possui um único fonte s e um único destino t. Um objetivo comum (transporte, etc.) é achar um fluxo s–t máximo. Fluxo s–t máximo Instância Grafo direcionado G = (V, E, c) com capacidades c nos arcos, um vértice origem s ∈ V e um vértice destino t ∈ V . Solução Um fluxo f, com f(v) = 0, ∀v ∈ V \ {s, t}. Objetivo Maximizar o fluxo f(s). Lema 9.2 Um fluxo s–t satisfaz f(s) + f(t) = 0. Prova. Pelo lema 9.1 temos v∈V f(v) = 0. Mas v∈V f(v) = f(s) + f(t) pela conservação de fluxo nos vértices em V \ {s, t}. Uma formulação como programa linear é maximiza f(s) (9.2) sujeito a f(v) = 0 ∀v ∈ V \ {s, t} 0 ≤ fe ≤ ce ∀e ∈ E. Observação 9.1 O programa (9.2) possui uma solução, porque fe = 0 é uma solução viável. O sistema não é ilimitado, porque todas variáveis são limitadas, e por isso possui uma solução ótima. O problema de encontrar um fluxo s–t máximo pode ser resolvido em tempo polinomial via programação linear. ♦ 9.1.1. Algoritmo de Ford-Fulkerson Nosso objetivo: Achar um algoritmo combinatorial mais eficiente. Idéia básica: Começar com um fluxo viável fe = 0 e aumentar ele gradualmente. 199

9.1. Fluxos em re<strong>de</strong>s<br />

A circulação vira um fluxo, se o grafo possui alguns vértices que são fontes<br />

ou <strong>de</strong>stinos <strong>de</strong> fluxo, e portanto não satisfazem a conservação <strong>de</strong> fluxo. Um<br />

fluxo s–t possui um único fonte s e um único <strong>de</strong>stino t. Um objetivo comum<br />

(transporte, etc.) é achar um fluxo s–t máximo.<br />

Fluxo s–t máximo<br />

Instância Grafo direcionado G = (V, E, c) com capacida<strong>de</strong>s c nos arcos,<br />

um vértice origem s ∈ V e um vértice <strong>de</strong>stino t ∈ V .<br />

Solução Um fluxo f, com f(v) = 0, ∀v ∈ V \ {s, t}.<br />

Objetivo Maximizar o fluxo f(s).<br />

Lema 9.2<br />

Um fluxo s–t satisfaz f(s) + f(t) = 0.<br />

Prova. Pelo lema 9.1 temos <br />

<br />

v∈V f(v) = 0. Mas v∈V f(v) = f(s) + f(t)<br />

pela conservação <strong>de</strong> fluxo nos vértices em V \ {s, t}. <br />

Uma formulação como programa linear é<br />

maximiza f(s) (9.2)<br />

sujeito a f(v) = 0 ∀v ∈ V \ {s, t}<br />

0 ≤ fe ≤ ce<br />

∀e ∈ E.<br />

Observação 9.1<br />

O programa (9.2) possui uma solução, porque fe = 0 é uma solução viável. O<br />

sistema não é ilimitado, porque todas variáveis são limitadas, e por isso possui<br />

uma solução ótima. O problema <strong>de</strong> encontrar um fluxo s–t máximo po<strong>de</strong> ser<br />

resolvido em tempo polinomial via programação linear. ♦<br />

9.1.1. Algoritmo <strong>de</strong> Ford-Fulkerson<br />

Nosso objetivo: Achar um algoritmo combinatorial mais eficiente. Idéia<br />

básica: Começar com um fluxo viável fe = 0 e aumentar ele gradualmente.<br />

199

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!