Definição do problema

Seja $G$ um grafo orientado com capacidades não-negativas $w_{i, j}$ nos arcos, e dois vértices $s$ (origem) e $t$ (destino). Qual o fluxo máximo que pode ser enviado de $s$ para $t$ respeitando as capacidades dos arcos?

A tabela abaixo mostra 3 algoritmos famosos que resolvem o problema do fluxo máximo em redes.

AlgoritmoComplexidade de tempoComplexidade de espaçoObservações
Ford-Fulkerson$\mathcal{O}(n)$$\mathcal{O}(n)$
Edmonds-Karp$\mathcal{O}(n)$$\mathcal{O}(n)$
Dinic$\mathcal{O}(n)$$\mathcal{O}(n)$

Algoritmo de Ford-Fulkerson

Este algoritmo busca por um caminho aumentante $p$ a cada iteração, ou seja, um caminho de $s$ para $t$ que passa somente por arcos com capacidade positiva no grafo residual. O grafo residual é inicializado igual ao grafo original, mas assim que um fluxo escoa por um caminho, as capacidades residuais dos arcos pertencentes ao caminho são atualizadas.

Uma vez que um caminho aumentante $p$ é encontrado, verifica-se a capacidade mínima $f$ (gargalo) dos arcos que pertencem ao caminho. Em seguida, duas operações são realizadas:

  1. Para cada arco de “avanço” $(i, j)$, subtrair de sua capacidade residual $\text{res}_{i, j}$ o montante $f$, i.e., $\text{res}_{i, j} = \text{res}_{i, j} - f$.
  2. Para cada arco de “retrocesso” $(j, i)$, somar à sua capacidade residual $\text{res}_{j, i}$ o montante $f$, i.e., $\text{res}_{j, i} = \text{res}_{j, i} + f$.
Mostrar implementação

Algoritmo de Edmonds-Karp

Algoritmo de Dinic