Definição
● Dado um grafo G(V,E) com arestas capacitadas
encontrar o máximo possível de fluxo que é possível transmitir entre dois nós especiais, chamados origem e destino, sem violar a
Modelagem matemática
● Seja k a quantidade de fluxo que passa na rede
● Seja u
ij a capacidade da aresta (i,j)
● Seja x
ij a quantidade de fluxo que passa pelo
aresta (i,j)
● Sejam s e t a origem e destino do fluxo
Modelagem matemática
Maximizar k Sujeito a
∑
j:(s , j)∈E
xsj−
∑
j:( j , s)∈E
x js=k
∑
j:(t , j)∈E
xtj−
∑
j:( j , t)∈E
x jt=−k
∑
j:(i , j)∈E
xij−
∑
j:( j , i)∈E
x ji=0,∀ i∈V −{s , t }
Rede Residual
● Normalmente construída para grafos
direcionados, mas também pode ser construída para grafos não direcionados
1
2
4 5
3 2
2
1 3
5
Rede Residual
● Os vértices são mantidos
1
2
4 5
3 2
2
1 3
5
1
2
4 5
Rede Residual
● Para cada arco (i,j) com custo e capacidade c
ij
e uij crie um arco (i,j) na rede residual com
custo cij e capacidade rij = uij – xij
1
2
4 5
3 2
2
1 3
5
1
2
4 5
3
Obs: Para o fluxo máximo, os custos não são relevantes 2
2
1 1
1 3
Rede Residual
● Para cada arco (i,j) com custo e capacidade c
ij
e uij crie um arco (j,i) na rede residual com
custo -cij e capacidade xij
1
2
4 5
3 2
2
1 3
5
1
2
4 5
3 2
2
1 1
1 3
Rede Residual
● A rede residual muda sempre que x mudar, e a
rede residual final é composta somente pelos arcos com capacidade maior que zero. Para x = 0 tem-se a seguinte rede
3 1
2
4 5
3 2
2
1
Rede Residual
● Para x
14 =2 e o restante das componentes de x
sendo zero temos
1
2
3 2
2
Algoritmo de Rótulos
● A ideia é simples. Encontre um caminho entre
os vértices s e t
● Sature este caminho com a maior quantidade
de fluxo possível
● Atualize a rede residual
● Repita os três passos anteriores enquanto
Exemplo
s t
10
10
2
8
1 10
10 1
Exemplo
1 2 3 4 5 6
1 0 0 0 0 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 0 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
Fluxo Residual
1 2 3 4 5 6
1 0 10 0 10 0 0
2 0 0 2 1 8 0
3 0 0 0 0 0 10
4 0 0 0 0 9 0
5 0 0 1 0 0 10
6 0 0 0 0 0 0
Exemplo
1 2 3 4 5 6
1 0 2 0 0 0 0
2 0 0 2 0 0 0
3 0 0 0 0 0 2
4 0 0 0 0 0 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
Fluxo Residual 1 4 2 3 5 6 8,2 10 2 8
1 8,2
10 1
9
1 2 3 4 5 6
1 0 8 0 10 0 0
2 2 0 0 1 8 0
3 0 2 0 0 0 8
4 0 0 0 0 9 0
5 0 0 1 0 0 10
Exemplo
1 2 3 4 5 6
1 0 3 0 0 0 0
2 0 0 2 0 1 0
3 0 0 0 0 0 3
4 0 0 0 0 0 0
5 0 0 1 0 0 0
6 0 0 0 0 0 0
Fluxo Residual 1 4 2 3 5 6 7,3 10 2 7,1
1 7,3
10
1
9
1 2 3 4 5 6
1 0 7 0 10 0 0
2 3 0 0 1 7 0
3 0 2 0 0 1 7
4 0 0 0 0 9 0
5 0 1 0 0 0 10
6 0 0 3 0 0 0
Exemplo
1 2 3 4 5 6
1 0 10 0 0 0 0
2 0 0 2 0 8 0
3 0 0 0 0 0 3
4 0 0 0 0 0 0
5 0 0 1 0 0 7
6 0 0 0 0 0 0
Fluxo Residual 1 4 2 3 5 6 10 10 2 8
1 7,3
3,7 1
9
1 2 3 4 5 6
1 0 0 0 10 0 0
2 10 0 0 1 0 0
3 0 2 0 0 1 7
4 0 0 0 0 9 0
5 0 8 0 0 0 3
Exemplo
1 2 3 4 5 6
1 0 10 0 3 0 0
2 0 0 2 0 8 0
3 0 0 0 0 0 3
4 0 0 0 0 3 0
5 0 0 1 0 0 10
6 0 0 0 0 0 0
Fluxo Residual 1 4 2 3 5 6 10 7,3 2 8
1 7,3
10 1
6,3
1 2 3 4 5 6
1 0 0 0 7 0 0
2 10 0 0 1 0 0
3 0 2 0 0 1 7
4 3 0 0 0 6 0
5 0 8 0 3 0 0
6 0 0 3 0 10 0
Exemplo
1 2 3 4 5 6
1 0 10 0 3 0 0
2 0 0 2 0 8 0
3 0 0 0 0 0 3
4 0 0 0 0 3 0
5 0 0 1 0 0 10
6 0 0 0 0 0 0
Fluxo Residual 1 4 2 3 5 6 10 7,3 2 8
1 7,3
10 1
6,3
1 2 3 4 5 6
1 0 0 0 7 0 0
2 10 0 0 1 0 0
3 0 2 0 0 1 7
4 3 0 0 0 6 0
5 0 8 0 3 0 0
6 0 0 3 0 10 0
Algoritmo de Rótulos
● Utiliza os conceitos de marcação de vértices e de
rede residual
● Sejam M e L vetores binários. M representa se
existe um caminho entre a origem e vértice. Assim M[i] contém 1 se o vértice i existe um caminho
entre a origem e i
● L tem comportamento similar mas indica uma
Algoritmo de Rótulos
● Seja p um vetor que indica quem é o predecessor
de um nó em um caminho. Similar a estratégia utilizada na resolução do caminho mínimo
● Seja X, também chamado fluxo, uma matriz que
Algoritmo de Rótulos
Procedimento aumentarFluxo(vetor pred,
matriz fluxo, RedeResidual Gr, vertice s, vertice t)
início
Usando pred, encontre a menor capacidade residual
em Gr, que esteja no caminho de s para t
Sendo cr a capacidade encontrada no passo
anterior, aumente fluxo em cr unidades em
todos os arcos do caminho
Atualize a rede residual Gr
Algoritmo de Rótulos
Algoritmo rotulos(Grafo G, Matriz X, Vértice s, Vértice t)
Início
X[i][j] = 0 para todo i, j em G.V
Seja G1 a rede residual de G e X
M[t]=1
enquanto ( M[t]==1 ) faça
M[i]=0 para todos os i em G.V
Algoritmo de Rótulos
enquanto (Soma(L)!=0) faça
escolha um i tal que L[i] seja 1
L[i]=0
Para( cada arco (i,j) em G1.E )faça
Se( M[j]==0 )Então
P[j]=i, M[j]=1, L[j]=1
fim se
Algoritmo de Rótulos
Se( M[T]==1 )então
aumentarFluxo(P, X, G1, s, t)
fim se
Algoritmo Escala de Capacidades
● O algoritmo de correção de rótulos não é
eficiente em termos do uso de fluxo
● O AEC tenta otimizar isso, levando maiores
Algoritmo Escala de Capacidades
● criar uma rede residual que atende um certo
patamar
● Saturar os caminhos desta rede
● Reduz o patamar
● Repetir os três passos anteriores enquanto o
Algoritmo Escala de Capacidades
Algoritmo escalaCapacidades(Fluxo x, Grafo G, Vértice s, Vértice t)
Início
x[i][j]=0 para todo i,j em G.V
delta= 2^piso(log(max(uij:(i,j) pertence a G.E))
defina Gr(G,x,delta)
Enquanto (delta >= 1)
Algoritmo Escala de Capacidades
Seja P o vetor de predecessores que
indicam o caminho de s à t em Gr
aumentarFluxo(P, x, Gr, s, t)
Fim enquanto
delta=delta/2, Atualize Gr(G,x,delta)
Exemplo
s t
10
10
2
8
1 10
10 1
Exemplo
1 4 2 3 5 6 10 10 8 10 10 9Delta= 2^ln10= 2^2 = 4 1 2 3 4 5 6
1 0 0 0 0 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 0 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
Fluxo Residual Delta
1 2 3 4 5 6
1 0 10 0 10 0 0
2 0 0 0 0 8 0
3 0 0 0 0 0 10
4 0 0 0 0 9 0
5 0 0 0 0 0 10
Exemplo
1 4 2 3 5 6 10 9 8 10 9 9Delta= 4 1 2 3 4 5 6
1 0 0 0 9 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 9 0
5 0 0 0 0 0 9
6 0 0 0 0 0 0
Fluxo
1 2 3 4 5 6
1 0 10 0 0 0 0
2 0 0 0 0 8 0
3 0 0 0 0 0 10
4 9 0 0 0 0 0
5 0 0 0 9 0 0
6 0 0 0 0 9 0
Exemplo
1 4 2 3 5 6 10 9 8 10 9 9Delta= 4/2=2
Fluxo
2
1 2 3 4 5 6
1 0 10 0 0 0 0
2 0 0 2 0 8 0
3 0 0 0 0 0 10
4 9 0 0 0 0 0
5 0 0 0 9 0 0
6 0 0 0 0 9 0
1 2 3 4 5 6
1 0 0 0 9 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 9 0
5 0 0 0 0 0 9
6 0 0 0 0 0 0
Exemplo
1 4 2 3 5 6 8,2 9 8 8,2 9 9Delta= 2
Fluxo
2
1 2 3 4 5 6
1 0 8 0 0 0 0
2 2 0 0 0 8 0
3 0 2 0 0 0 8
4 9 0 0 0 0 0
5 0 0 0 9 0 0
6 0 0 2 0 9 0
1 2 3 4 5 6
1 0 2 0 9 0 0
2 0 0 2 0 0 0
3 0 0 0 0 0 2
4 0 0 0 0 9 0
5 0 0 0 0 0 9
6 0 0 0 0 0 0
Exemplo
1 4 2 3 5 6 8,2 1,9 8 8,2 1,9 9Delta= 2/1=1
Fluxo
2
1 1
Residual Delta
1 2 3 4 5 6
1 0 2 0 9 0 0
2 0 0 2 0 0 0
3 0 0 0 0 0 2
4 0 0 0 0 9 0
5 0 0 0 0 0 9
6 0 0 0 0 0 0
1 2 3 4 5 6
1 0 8 0 1 0 0
2 2 0 0 1 8 0
3 0 2 0 0 0 8
4 9 0 0 0 0 0
5 0 0 1 9 0 1
Exemplo
1 4 2 3 5 6 7,3 1,9 7,1 7,3 1,9 9Delta= 1
Fluxo
2
1 1
Residual Delta
1 2 3 4 5 6
1 0 3 0 9 0 0
2 0 0 2 0 1 0
3 0 0 0 0 0 3
4 0 0 0 0 9 0
5 0 0 1 0 0 9
6 0 0 0 0 0 0
1 2 3 4 5 6
1 0 7 0 1 0 0
2 3 0 0 1 7 0
3 0 2 0 0 1 7
4 9 0 0 0 0 0
5 0 1 0 9 0 1
Exemplo
1 4 2 3 5 6 6,4 1,9 6,2 7,3 10 9Delta= 1
Fluxo
2
1 1
Residual Delta
1 2 3 4 5 6
1 0 4 0 9 0 0
2 0 0 2 0 4 0
3 0 0 0 0 0 3
4 0 0 0 0 9 0
5 0 0 1 0 0 10
6 0 0 0 0 0 0
1 2 3 4 5 6
1 0 6 0 1 0 0
2 4 0 0 1 6 0
3 0 2 0 0 1 7
4 9 0 0 0 0 0
5 0 2 0 9 0 0
Algoritmo Escala de Capacidades
Algoritmo escalaCapacidades(Fluxo x, Grafo G, Vértice s, Vértice t)
Início
x[i][j]=0 para todo i,j em G.V
delta= 2^piso(ln(max(uij:(i,j) pertence a G.E))
defina Gr(G,x,delta)
Enquanto (delta >= 1)
Algoritmo Escala de Capacidades
Seja P o vetor de predecessores que
indicam o caminho de s à t em Gr
aumentarFluxo(P, x, Gr, s, t)
Fim enquanto
delta=delta/2, Atualize Gr(G,x,delta)
Problema do Corte Mínimo
● Dado um grafo, encontrar o conjunto de
arestas de menor peso de forma que, se
Problema do Corte Mínimo
● Este é o problema dual do problema de fluxo
máximo
● Resolvendo o problema de fluxo máximo,
Problema do Corte Mínimo
● Usando a rede residual do fluxo máximo em
um grafo, separa-se os vértices em dois
conjuntos: Marcados (M) e não marcados (nM)
● O conjunto M começa com a origem do fluxo, o
nM com todos os outros
● Acrescenta-se iterativamente em M vértices de
Problema do Corte Mínimo
● A cada iteração, acrescenta-se um vértice de
nM em M
● A partir de algum vértice v de M, escolhe-se um
vértice adjacente a v que esteja em nM.
Problema do Corte Mínimo
● O processo continua até que nenhum vértice
em M possua um vértice adjacente em nM (usando arcos de capacidade não nula)
● No final do procedimento o grafo estará
bipartido
● O corte mínimo é o conjunto de arcos que
Problema do Corte Mínimo
Exemplo: Grafo, fluxo de 0 para 6
0
1
2
3
4
5
6 7
5
4
1
3
2
4 5
4
1
Problema do Corte Mínimo
Exemplo: Fluxo Máximo 14 unidades
0
1
2
3
4
5
6 7,7
5,4
4,3
1,1
3,3
2,0
4,3
5,4
4,4
1,1
6,6
Problema do Corte Mínimo
Exemplo: Rede residual
0
1
2
3
4
5
6 7
1
1
1
3
2
1
4
1 6
1 8
3
1 4
4
Problema do Corte Mínimo
Exemplo: Marcado={} 0 1 2 3 4 5 6 7 1 1 1 3 2 1 4 1 6 1 8 3 1 4 4 3Problema do Corte Mínimo
Exemplo: Marcados em vermelho
0
1
2
3
4
5
6 7
1
1
1
3
2
1
4
1 6
1 8
3
1 4
4
Problema do Corte Mínimo
Exemplo: Marcados em vermelho
0 1 2 3 4 5 6 7 1 1 1 3 2 1 4 1 6 1 8 3 1 4 4 3
Problema do Corte Mínimo
Exemplo: Marcados em vermelho
0
1
2
3
4
5
6 7
1
1
1
3
2
1
4
1 6
1 8
3
1 4
4
Problema do Corte Mínimo
Exemplo: Marcados em vermelho
0 1 2 3 4 5 6 7 1 1 1 3 2 1 4 1 6 1 8 3 1 4 4 3
Problema do Corte Mínimo
Exemplo: Marcados em vermelho
0
1
2
3
4
5
6 7
1
1
1
3
2
1
4
1 6
1 8
3
1 4
4
Problema do Corte Mínimo
Exemplo: Vértices marcados no grafo original
O corte mínimo é dado pelos arcos que ligam os vértices marcados aos vértices não marcados. Neste caso {(1,4), (2,4), (5,4), (5,6)}. Ao somar a 0
1
2
3
4
5
6 7
5
4
1
3
2
4 5
4
1
Problema do Corte Mínimo
Exemplo: Vértices marcados no grafo original
0
1
2
3
4
5
6 7
5
4
1
3
2
4 5
4
1
Problema do Corte Mínimo
Procedimento marcar(Grafo G, Vértice s, Lógico[] Marcado)
Início
Marcado[s]= verdadeiro
Para( todo Vértice i em G )Faça
Se(exitem um arco (s,i) em G com capacidade não nula & !Marcado[i]) Então
marcar(G,i,Marcado)
Fim Se
Problema do Corte Mínimo
Procedimento corteMínimo(Grafo G, Vértice s, Vértice t)
Início
Encontre o fluxo máximo X em G
Seja gr a rede residual de G e X
Problema do Corte Mínimo
Para( todo vértice i em V ) Faça
Para(todo vértice j em V) Faça
Se (marcado[i] & !marcado[j] & existe um arco (i,j) em G.E )Então
Imprimir “Arco ”+ i +“ ”+ j
Fim Se
Fim Para