Você está na página 1de 9

Algoritmos Complementares em Grafos

Algoritmos Complementares Digrafos - Fechamento transitivo


em Grafos O fechamento transitivo de um
2 4

digrafo dá a idéia da alcança-


Notas de aula da disciplina IME 04-10829 bilidade no mesmo. 1 6
(Algoritmos em Grafos) Normalmente é representado
como uma matriz de adjacên-
3 5
cias.
Paulo Eustáquio Duarte Pinto
(pauloedp at ime.uerj.br) Matriz de Ajacências Fechamento transitivo
0 1 1 0 0 0 1 1 1 1 1 1
0 0 0 0 1 0 0 1 0 1 1 1
0 0 0 0 1 0 0 1 1 1 1 1
0 1 0 0 0 0 0 1 0 1 1 1
dezembro/2009 0 0 0 1 0 1 0 1 0 1 1 1
1 2
0 0 0 0 0 0 0 0 0 0 0 1

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - Fechamento transitivo Digrafos - Fechamento transitivo


2 4 2 4

O fechamento transitivo é
1 6 O fechamento transitivo é 6
equivalente a se adicionar 1
equivalente a se adicionar os
todas as arestas entre
auto-loops na matriz de
vértices alcançáveis + 3 5 adjacências A e calcular An. 3 5
autoloops.

Matriz de Ajacências Matriz de Ajacências A +autoloops A2


Fechamento transitivo
0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0
0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 1
0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1
0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0
0 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 1 1
0 0 0 0 0 0 0 0 0 0 0
3
1 0 0 0 0 0 1 0 0 0 0 0 1
4

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - Fechamento transitivo Digrafos - Fechamento transitivo


2 4

Exercício: Determinar, intuitivamente, o fechamento Algoritmos:. 6


1
transitivo do digrafo abaixo

3 5
5 4
1- BP a partir de cada vértice: Complexidade O(n(n+m))

2- Potenciação de A (matriz c/ autoloops). Complexidade: O(n3log n)

3 3- Algoritmo de Warshall: Complexidade: O(n3)

1
2 5 6

1
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

2 4
Digrafos - Fechamento transitivo Digrafos - Fechamento transitivo 2 4

1 6
2- Potenciação de A Algoritmo de Warshall. 6
1
3 5 Baseado na transitividade:
se i alcança k e k alcança j,
Algoritmo: ProdMat(M1,M2); então i alcança j. 3 5
Potencia(p); Para i de 1 a n:
Se (p = 1) Então Retornar A Para j de 1 a n:
Senão M3[i,j] ← 0;
Algoritmo:
Para k de 1 a n k= 1
B ← Potencia(p/2); Warshall:
Se (M1[i,k]=1) e
B ← ProdMat(B,B); (M2[k,j]=1) Então Para i de 1 a n: A[i, i] ← 1; Fp; k= 2
Se ((p mod 2) = 1) Então M3[i,j] ← 1; Para k de 1 a n;
B ← ProdMat(B,A); Para i de 1 a n: k= 3
Fp;
Retornar B; Fp; Para j de 1 a n: k= 4
Fim; Fp; Se ((A[i,k]=1) E (A[k, j]=1)) Então A[i, j] ← 1;
Retornar M3; Fp; k= 5
Complexidade: O(n3logn) Fim; Fp;
Fp; k= 6
7 Fim; Complexidade: O(n3) 8

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - Fechamento transitivo Digrafos - Fechamento transitivo 2 4


2 4

Algoritmo de Warshall. Algoritmo de Warshall. 6


(versão levemente melhorada) 1 6 Porque funciona? 1

3 5 3 5
Indução em k: Warshall:
Para i de 1 a n: A[i, i] ← 1; Fp;

Algoritmo: Após a primeira execução do loop p/ i e j, Para k de 1 a n;


Para i de 1 a n:

Warshall: com k = 1, A[i,j] só será 1 se existir Para j de 1 a n:


Se ((A[i,k]=1) E (A[k, j]=1))

Para i de 1 a n: A[i, i] ← 1; Fp; caminho i-j ou i-1-j. Fp;


Então A[i, j] ← 1;

Para k de 1 a n; . Suponhamos que imediatamente antes de Fp;


Fp;

Para i de 1 a n: executar o loop para k, já foram determi- Fim;

Se (A[i, k] = 1) Então nados todos os caminhos entre i e j, onde o


Para j de 1 a n: maior vértice é menor que k, excetuando-se
Se (A[k, j] = 1) Então A[i, j] ← 1; i e j.
Fp; Então só há um novo caminho se houver
Fp; caminho de i a k e de k a j, mantendo,
Fp; portanto, a propriedade.
9 10
Fim; Complexidade: O(n3)

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos 2 4


Digrafos - Fechamento transitivo 2
Problema: Dado um vértice em 13 9
um digrafo ponderado, sem 1 3 6
Exercício: Determinar, usando Warshall, o fechamento pesos negativos, determinar os
transitivo do digrafo abaixo caminhos de peso mínimo deste 3
3 5
4
vértice para cada um dos
demais. 5

5 4 Algoritmo de Dijkstra

Este é um algoritmo guloso que, escolhe e marca um vértice,


determinando em definitivo sua distância mínima ao vértice
inicial. Para escolher o vértice ainda não marcado usa-se o
3 seguinte princípio:
Dentre os vértices não marcados, pode-se fixar a distân-
cia para aquele com distância mínima ao vértice inicial,
considerando apenas vértices marcados.
Ao se marcar um vértice, são recalculadas as distâncias dos
1 vizinhos ainda não marcados
2 11 12

2
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos 2 4 Grafos - Caminhos mínimos 2 4


2 2
Algoritmo de Dijkstra Algoritmo de Dijkstra
13 9 13 9
1 3 6 1 17 6
3 3
3 5
4 3 5
4
5 9
Algoritmo:
Dijkstra(v1);
Para cada vértice i: Dist[i] ← ∞; Desmarcar i; Fp; 1 2 3 4 5 6
Dist[v1] ← 0; Pai[v1] ← v1; ∞ 0/2 ∞ ∞ ∞ ∞
Para i de 1 a n:
w ← vértice n/ marcado de dist. mínima; Marcar w; 13/2 0/2 ∞ 2/2 17/2 ∞
Para z vizinho de w, não marcado: 13/2 0/2 ∞ 2/2 11/4 ∞
Se (Dist[w] + peso(w,z) < Dist[z]) Então
Dist[z] ← Dist[w] + peso(w,z); 13/2 0/2 20/5 2/2 11/4 15/5
Pai[z] ← w; 13/2 0/2 16/1 2/2 11/4 15/5
Fp;
Fe; 13
13/2 0/2 16/1 2/2 11/4 15/514
Fim; Complexidade: O(m log n)

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos mínimos 2 4


2 Digrafos - Caminhos Mínimos 2 2 4
Algoritmo de Dijkstra 13 9
13 9 1 3 6
3 6 Algoritmo de Dijkstra. 3
1 3 5
4
Porque funciona? 5
3
3 5
4
5 Indução em i:
Para i=0, o algoritmo está correto.
1 2 3 4 5 6 Suponhamos correto para i < n. Então suponhamos que, na interação
i, vá ser escolhido t, e que o caminho mínimo de t a v1 (vértice
0/1 ∞ ∞ ∞ ∞ ∞ inicial) contenha, inicialmente vértices marcados, mas depois
0/1 13/1 3/1 ∞ ∞ ∞ vértices não marcados e seja x o último vértice não marcado.
Então é uma contradição escolher t, pois a distância de x a v1 só
0/1 13/1 3/1 ∞ 8/3 ∞ usa vértices marcados e é menor que a distância calculada para t.
0/1 11/5 3/1 17/5 8/3 12/5 Portanto t não poderia ser escolhido na interação i.

0/1 11/5 3/1 13/2 8/3 12/5


0/1 11/5 3/1 13/2 8/3 12/5 15 16

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos - Dijkstra Grafos - Caminhos Mínimos 2 4


2
Algoritmo de Dijkstra
13 9
Como exibir um caminho mínimo 1 3 6
Exercício: Aplicar o algoritmo de Dijkstra ao grafo de v1 a t?
3
abaixo, a partir do vértice da sua escolha: Interação retrógrada usando o 4
vetor Pai 3 5
5

2 9 4 5 6 8 1 Caminhominimo(v1,t);
6 10 Dijkstra(v1); i ← 1; C[1] ← t;
4 3 Enquanto (t ≠ v1):
11 18 2 t ← Pai[t]; i ← i+1; C[i] ← t;
Fe;
Imprimir vetor C inversamente.
3 7 5 3 7 19 8 Fim;

17 18
teste 33

3
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos 2 4 Grafos - Caminhos Mínimos 2 4


2 2
Algoritmo de Dijkstra Algoritmo de Dijkstra
13 9 13 9
Como exibir todos os caminhos 1 3 6 Como exibir um caminho mínimo 1 3 6
mínimos de v1 a t? de v1 a t?
Backtracking usando o vetor de
3 Ex: determinação de caminho
3
3 5
4 3 5
4
distâncias mínimas e matriz E. mínimo de 1 a 4
5 5
Caminhos(u,d);
Se (d = 0) Então Imprimir vetor C inversamente
Senão Pai: 1 5 1 2 3 5
Para w vizinho de t:
Se ((Dist[w] + E[w,u]) = d) Então
nc ← nc+1; C[nc] ← w;
Caminhos(w, d-E[w,u]); i 1 2 3 4 5
nc ← nc-1; t 4 2 5 3 1
Fp;
Fim; C[i] 4 2 5 3 1
Externamente:
Dijkstra(v1); nc ← 1; C[1] ← t; Caminhos(t,Dist[t]); 19 20
teste 34

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos


Digrafos - (Todos
Grafos - Caminhos Mínimos - Dijkstra caminhos Mínimos) - 2 4
2
Algoritmo de Floyd
Aplicação: Problema do Carteiro Chinês 13 9
1 3 6
Dado um grafo ponderado, determinar o circuito Idéia: Análoga ao fechamento
Euleriano de custo mínimo, considerando-se que pode transitivo. 3
3 5
4
haver necessidade de repetição de arestas. 5
9 5 8 Algoritmo de Floyd
2 4 6 1 DM ← E;
6 10 Para k de 1 a n;
4 3 Para i de 1 a n:
11 18 2 Se (DM[i, k] ≠ ∞) Então
Para j de 1 a n:
7 3 Se (i ≠ j) e (DM[k,j] ≠ ∞) e
3 5 7 19 8 ((DM[i,j] = ∞) ou (DM[i,j] > DM[i, k]+DM[k, j])) Então
DM[i, j] ← DM[i, k] + DM[k, j];
Solução: Determinar o emparelhamento de vértices Fp;
ímpares cujo custo total seja mínimo. Para tanto, Fp;
21 Fp; Complexidade: 22O(n3)
aplicar Dijkstra aos vértices ímpares e... teste 35

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - (Todos 2 4 Digrafos - (Todos 2 4


2 2
caminhos Mínimos) - caminhos Mínimos) -
Algoritmo de Floyd 13 9 Algoritmo de Floyd 13 9
1 3 6 1 3 6
k= 1 3 k= 1 3
3 5
4 k= 2 3 5
4
5 5
Matriz de Distâncias Matriz de Distâncias

0 13 3 ∞ ∞ ∞ 0 13 3 ∞ ∞ ∞ 0 13 3 ∞ ∞ ∞ 0 13 3 15 16 ∞
13 0 ∞ 2 3 ∞ 13 0 16 2 3 ∞ 13 0 16 2 3 ∞ 13 0 16 2 3 ∞
3 ∞ 0 ∞ 5 ∞ 3 16 0 ∞ 5 ∞ 3 16 0 ∞ 5 ∞ 3 16 0 18 5 ∞
∞ 2 ∞ 0 9 ∞ ∞ 2 ∞ 0 9 ∞ ∞ 2 ∞ 0 9 ∞ 15 2 18 0 5 ∞
∞ 3 5 9 0 4 ∞ 3 5 9 0 4 ∞ 3 5 9 0 4 16 3 5 5 0 4
∞ ∞ ∞ ∞ 4 0 ∞ ∞ ∞ ∞ 4 0
23 ∞ ∞ ∞ ∞ 4 0 ∞ ∞ ∞ ∞ 4 0
24

4
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - (Todos 2 4 Digrafos - (Todos 2 4


2 2
caminhos Mínimos) - caminhos Mínimos) -
Algoritmo de Floyd 13 9 Algoritmo de Floyd 13 9
1 3 6 1 3 6
k= 1 3 k= 1 k= 4 3
k= 2 3 5
4 k= 2 k= 5 3 5
4
k= 3 5 k= 3 k= 6 5
Matriz de Distâncias Matriz de Distâncias (DM)

0 13 3 15 16 ∞ 0 13 3 15 8 0 0 13 3 15 8 ∞ 0 11 3 13 8 12
13 0 16 2 3 ∞ 13 0 16 2 3 0 13 0 16 2 3 ∞ 11 0 8 2 3 7
3 16 0 18 5 ∞ 3 16 0 18 5 0 3 16 0 18 5 ∞ 3 8 0 10 5 9
15 2 18 0 5 ∞ 15 2 18 0 5 0 15 2 18 0 5 ∞ 13 2 10 0 5 9
16 3 5 5 0 4 8 3 5 5 0 4 8 3 5 5 0 4 8 3 5 5 0 4
∞ ∞ ∞ ∞ 4 0 0 0 0 0 4 0
25
∞ ∞ ∞ ∞ 4 0 12 7 9 9 4 0
26

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos 2 4


Digrafos - Fechamento transitivo 2
Algoritmo de Floyd
13 9
Como exibir um caminho mínimo 1 3 6
Exercício: Determinar, usando Floyd, todos os caminhos de v a t?
mínimos no grafo abaixo Interação usando a matriz de
3
3 5
4
distâncias mínimas
5
1 Caminho(v, t);
5 4 d ← DM[v,t];
Enquanto (d > 0):
2 4 Para w vizinho de v:
Se ((DM[w,t] + E[v,w]) = d) Então Parar loop;
3 Fp;
Imprimir v;
d ← d - E[v,w];
5 3 v ← w;
Fe;
1 Imprimir t;
2 27 Fim; 28

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Caminhos Mínimos 2 4 Digrafos - Caminhos Mínimos


2 2 2 4
Algoritmo de fLOYD 13 9
13 9 1 3 6

Como exibir um caminho mínimo 3 6 Algoritmo de Floyd. 3


1 3 5
4
de v1 a t? Porque funciona? 5
Ex: determinação de caminho
3
3 5
4
mínimo de 1 a 4
5
0 11 3 13 8 12 Demonstração análoga ao do algoritmo de Warshall:
11 0 8 2 3 7 A cada passo do loop em k, determina caminhos entre s
DM: 3 8 0 10 5 9 e t que só utilizam vértices até o índice k, excetuando-
v t w d Imprime: se s e t.
13 2 10 0 5 9
1 4 3 13 1 8 3 5 5 0 4
3 4 5 10 3 12 7 9 9 4 0

5 4 2 5 5 0 13 3 0 0 0
2 4 4 2 2 13 0 0 2 3 0
E: 3 0 0 0 5 0
0 4
0 2 0 0 9 0
0 3 5 9 0 4
0 0 0 0 4 0 29 30

5
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos
Grafos - Árvore Geradora Grafos -
2 4
Mínima (MST) Árvore Geradora Mínima 8
2 4
8 (MST) 7
Algoritmo de Prim 6
7 1 3 6
6
Idéia: Obter uma árvore 1 3 6 3
3 5
4
geradora c/ o menor(maior) 3
custo total (AGM) 4 5
3 5
(forma mais econômica ou de 5 Algoritmo de Prim
maior lucro para se interligar Para cada vértice i: Custo[i] ← ∞; Desmarcar i; Fp;
todos os vértices) T ← vazia; (v,w) ← aresta de menor peso; Marcar v;
Para vizinhos z de v: Custo[z] ← peso(v,z); MV[z] ← v;
Algoritmo de Prim Enquanto (existir vértice não marcado):
w ← vértice n/ marcado de menor custo;
Este é um algoritmo guloso que usa os seguintes princípios: Marcar w;
T ← T + (w, MV[w]);
1) A aresta de menor peso faz parte da AGM. Para z vizinho de w, não marcado:
2) A AGM é construída colocando-se, a cada passo, a Se (Custo[z] > peso(w,z)) Então
aresta de menor peso que liga os vértices ainda não Custo[z] ← peso(w,z); MV[z] ← w;
escolhidos aos já escolhidos 31 Fp; 32
Fe;

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Grafos - Árvore Geradora 2 4 Grafos - Árvore Geradora Mínima


Mínima (MST) -Algoritmo de Prim 8
7 6
1 3 6
3
Exercício: Determinar a árvore geradora mínima para
3 4 o grafo abaixo:
5
5

1 2 3 4 5 6 Aresta 9 5 8
2 4 6 1
∞ ∞ ∞ ∞ ∞ ∞ 6 10
7/2 ∞ ∞ 8/2 3/2 ∞ 4 3
11 18 2
7/2 ∞ ∞ 8/2 3/2 ∞ (2, 5)
7/2 ∞ 5/5 6/5 3/2 4/5 (5, 6) 7 3
3 5 7 19 8
7/2 ∞ 5/5 6/5 3/2 4/5 (5, 3)
3/3 ∞ 5/5 6/5 3/2 4/5 (3, 1)
3/3 ∞ 5/5 6/5 3/2 4/5 (5, 334) 34

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - Fluxos em Redes 2/1 Digrafos - Fluxos em Redes 2/1


2 4 2 4
2/0
Rede Residual 2/0
3/2 3/2
Numa rede há fontes (1), 1/1 A rede residual é criada a 1/1
sumidouros (6) e nós inter- 1/1 6 partir de um Fluxo, criando: 1/1 6
1 1
mediários. a) arestas contrárias para
Cada aresta tem sua 4/1 cada aresta com fluxo 4/1
3 5 3/3 3 5 3/3
capacidade(c) e seu b) arestas diretas para cada
fluxo(f). 3/1 quantidade residual de uma 3/1
O fluxo máximo da rede aresta não saturada.
pode ser medido nas Se houver caminho entre
fontes. fonte/sumidouro na RR, o
fluxo pode ser melhorado.
Algoritmo de Fluxo Máximo (Ford-Fulkerson)

Idéia: Começar com um Fluxo inicial e, a cada passo, Algoritmo de Fluxo Máximo (Ford-Fulkerson)
melhorar esse fluxo até se chegar a um valor Máximo.
O aumento gradativo é feito examinando-se a rede residual. Idéia: Começar com um Fluxo inicial e, a cada passo,
Enquanto houver algum caminho na rede residual entre uma melhorar esse fluxo até se chegar a um valor Máximo.
fonte e um sumidouro, o Fluxo Total pode ser melhorado. O aumento gradativo é feito examinando-se a rede residual.
35 Enquanto houver algum caminho na rede residual entre uma 36
fonte e um sumidouro, o Fluxo Total pode ser melhorado.

6
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos
Digrafos - Fluxos em Redes 2/1 Digrafos - Fluxos em Redes 2/1
2 4 2 4
Rede Residual 2/0
Algoritmo Ford-Fulkerson 2/0
3/2
3/2
A rede residual é criada a 1/1 1/1
partir de um Fluxo, 1/1 6 1/1 6
1 1
criando:
a) arestas contrárias para 4/1 4/1
3 5 3/3 3 5 3/3
cada aresta com fluxo Algoritmo (I):
b) arestas diretas para 3/1 3/1
cada quantidade residual 1 Zerar Fluxo Total FT e fluxos nas arestas fl(v,w)
de uma aresta não Construir a rede residual R’
saturada. 2 4 Enquanto (houver caminho c = fo...s em R’):
2 1 2 Delta ← Min {Capacidade das arestas do caminho c}
Para cada aresta (v, w) de c:
Exemplo de RR para o fluxo 1 1 1 6 Se (v,w) é aresta direta, Então fl(v,w) ← fl(v,w)+ Delta
acima 1
1 Senão fl(v,w) ← fl(v,w) -Delta;
3 1 FT ← FT + Delta;
3 5 3 Fp;
2 Construir a rede residual R’;
Fe;
37 38

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos


Digrafos - Fluxos em Redes Algoritmo Ford-Fulkerson Digrafos - Fluxos em Redes Algoritmo Ford-Fulkerson

Algoritmo (II)
FluxoMaximo;
FT ← 0; Algoritmo (III)
Zerar fluxos nas arestas; (E[v,w].fl)
Enquanto (1): FluxoMaximo;
Se (ExisteCaminho) Então FT ← 0;
Delta ← MinAresta; {Aresta mínima do caminho} Zerar fluxos nas arestas; (E[v,w].fl)
Para cada aresta (v, w) do caminho: Enquanto (1):
Se (v,w) é aresta direta, Então Se (ExisteCaminho) Então
E[v,w].fl ← E[v,w].fl + Delta Delta ← MinAresta; {Aresta mínima do caminho}
Senão AtualizaCaminho(Delta);
E[v,w].fl ← E[v,w].fl -Delta; FT ← FT + Delta;
FT ← FT + Delta; Senão Parar;
Fp; Fe;
Senão Parar; Fim;
Fe;
Fim; {Obs: matriz de Adjacências E = { cap, fl } }
39 40
{Obs: matriz de Adjacências E = { cap, fl } }

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos

Digrafos - Fluxos em Redes Algoritmo Ford-Fulkerson Digrafos - Fluxos em Redes Algoritmo Ford-Fulkerson

ExisteCaminho; MinAresta;
Desmarcar vértices; Esvaziar Fila; min ← ∞; j ← r;
Enfilar(fonte, 0, 0, ‘ ‘); {Obs: nó da fila = { ver, pai, val}} Enquanto (Fila[j].ver <> fonte):
Enquanto (f ≤ r): Se (Fila[j].val < min) Então min ← Fila[j].val;
w ← Fila[f].ver; j ← Fila[j].pai;
Para i de 1 a n: Fe;
Se (i não marcado) Então MinAresta ← min;
Se (E[w,i].fl < E[w,i].cap) Então Fim;
Enfilar(i, f, E[w,i].cap - E[w,i].fl, ‘d’);
Se (i = sumidouro) Então Parar; AtualizaCaminho(min);
Se (E[i,w].fl > 0) e (i não marcado) Então j ← r; v ← Fila[j].ver; p ← Fila[j].pai; w ← Fila[p].ver;
Enfilar(i, f, E[i,w].fl, ‘c’); Enquanto (v <> fonte):
Se (i = sumidouro) Então Parar; Se (Fila[j].tipoaresta = ‘d’) Então
Fp; E[w, v].fl ← E[w, v].fl + min
f ← f+1; Senão E[v, w].fl ← E[v, w].fl - min;
Fe; j ← p; v ← Fila[j].ver; p ← Fila[j].pai;
ExisteCaminho ← (Fila[r].ver = sumidouro); Se (v <> fonte) Então w ← Fila[p].ver;
Fim; Fe;
41 42
Fim;

7
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos
Digrafos - Fluxos em Redes 2/1 Digrafos - Fluxos em Redes 2/1
2 4 2 4
Ford-Fulkerson - Exemplo 2/0
Ford-Fulkerson - Exemplo 2/1
2/2 (cont.) 3/2
1/1 1/1 1/1 1/0
1 6 1 6

4/1 4/2
3 5 3/3 3 5 3/3
3/1 3/2
1 1

2 4 2 4
Primeira rede Residual - 2 Segunda rede Residual - 1
1 2 1
Encontrado o caminho Encontrado o caminho 2
1- 3 - 5 - 4 - 6 1 1 1- 3 - 5 - 2 - 4-6 1 1 1
1 6 1 6
cujo valor mínimo é 1 1 cujo valor mínimo é 1 1
1 2
O Fluxo total pode O Fluxo total pode
ser aumentado de 1. 3 1 ser aumentado de 1. 2 2
3 5 3 3 5 3
2 1

43 44

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos


Digrafos - Fluxos em Redes 2/2
Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo
Ford-Fulkerson - Exemplo 2 4
2/2 Problema 10330 - Power Transmission
(cont.) 3/2
1/0 1/0
1 6

4/3
3 5 3/3
3/3

2 4
2 2
2
Terceira Rede Residual
1 1
Não há mais caminho entre 1 6
1
1 e 6. O Fluxo 5 é máximo. 1 Dado adicional: cada “regulador” tem uma capacidade máxima.
3 3 No caso: 1 (10), 2 (20) , 3 (30), 4 (40).
3 5 3

45 46

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos


Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo
Problema 10330 - Power Transmission - Modelagem Problema 10330 - Power Transmission - Fluxo Máximo

1 10 5 1 10/10 5
10 13 10/10 13/10
10 10

0 30 3 30 7 20 4 40 8 40 9 0 30/20 3 30/20 7 20/20 4 40/37 8 40/37 9


2 2
20 5 5 7 20/7 5 5 7/7

2 20 6 2 20/7 6

47 48

8
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos
Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo

Emparelhamento máximo em grafo bipartido - Emparelhamento máximo em grafo bipartido -


Casamento estável Casamento estável
Dados n rapazes e m garotas e os interesses, determinar o maior 1 2 3 4 5 6 Solução 1
número de casais que podem ser formados (4)

1 2 3 4 5 6
7 8 9 10 11 12

1 2 3 4 5 6 Solução
7 8 9 10 11 12 ótima
(5)

49 7 8 9 10 11 12 50

Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos


Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo Digrafos - Fluxos em Redes Ford-Fulkerson - Exemplo

Emparelhamento máximo em grafo bipartido - Emparelhamento máximo em grafo bipartido -


Casamento estável - Modelagem por Fluxo Casamento estável - Modelagem por Fluxo

0
1- Acrescenta-se uma
fonte e um sumidouro.

2. Liga-se a fonte ao
1 2 3 4 5 6 1 2 3 4 5 6 conjunto V1

3. Liga-se o V2 ao
sumidouro.

7 8 11 12 7 8 11 12 4. As arestas de V1
9 10 9 10
p/V2 passam a ser
direcionadas.

5. Todas as
51 52
13 capacidades são 1.

Algoritmos Complementares em Grafos

FIM

53

Você também pode gostar