Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
3 5
5 4
1- BP a partir de cada vértice: Complexidade O(n(n+m))
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
3 5 3 5
Indução em k: Warshall:
Para i de 1 a n: A[i, i] ← 1; Fp;
5 4 Algoritmo de Dijkstra
2
Algoritmos Complementares em Grafos Algoritmos Complementares em Grafos
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
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
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
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;
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
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
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 } }
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
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
1 10 5 1 10/10 5
10 13 10/10 13/10
10 10
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
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
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.
FIM
53