Problema do Fluxo Máximo Algoritmos Algoritmo de Ford Fulkerson para o Fluxo Máximo begin x := 0 (inicializar o fluxo); Construir a rede residual G(x); while existir algum caminho orientado de s para t em G(x) do begin seja P um caminho de aumento de s para t em G(x); := d(P); enviar unidades de fluxo ao longo de P; actualizar as capacidades residuais r; end end {o fluxo x é máximo}. Algoritmo de Ford-Fulkerson 2 Exemplo 4 2 3 5 1 1 1 2 2 s 4 3 1 t 2 3 3 Algoritmo Ford-Fulkerson begin Etiquetar t while t está etiquetado do begin retirar as etiquetas a todos os nodos; Pred(j):=0 para todo j em N; Etiquetar s e fazer LISTA:={s}; While LISTA OU t não está etiquetado do begin retirar um nodo i da lista; for cada arco (i,j) da rede residual do se rij > 0 e j não está etiquetado then pred(j):=i; etiquetar j; LISTA:=LISTA{j}; end If t está etiquetado then aumentaFluxo; end end 4 Algoritmo Ford-Fulkerson Procedure aumentaFluxo; begin use o vector pred para encontrar o caminho de aumento P de s para t; d(P) = min{rij : (i,j) P}; aumente o fluxo ao longo de P em d(P) unidades actualizando as capacidades residuais: rij := rij - d(P) e rji := rji + d(P) para (i,j) P end Algoritmo de Ford-Fulkerson 5 Exemplo 4 2 3 5 1 1 1 2 2 s 4 3 1 t 2 3 6 Algoritmo do caminho de aumento + curto begin determinar as etiquetas distância d(i) while d(s) < n do begin if existe um nodo i com d(i) d(s) e sem arcos admissíveis then Relabel(i) else encontrar um caminho admissível de s para t e aumentar o fluxo ao longo do caminho (usar pred) end end Procedure Relabel(i) begin if i não tem arcos admissíveis then d(i) := 1 + min {d(j) : rij > 0}; Algoritmo de Ahuja e Orlin if d(s) > n-1, then exit; end 7 Exemplo 4 2 3 5 1 1 1 2 4 s 4 3 1 t 2 3 Rede inicial e rede residual inicial. 8