Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Motivação
Aplicações
Conceitos Básicos
0 1 4
2 vértice
• Notação: G = (V, A)
– G: grafo
– V: conjunto de vértices
– A: conjunto de arestas
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 4
Grafos Direcionados
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 5
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 6
Grau de um Vértice
• Em grafos direcionados
– O grau de um vértice é o número de
arestas que saem dele (out-degree) mais
o número de arestas que chegam nele
(in-degree).
Ex.: O vértice 2 tem 0 1 4
in-degree 2, out-degree
2 e grau 4.
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 7
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 8
Ciclos
• Em um grafo direcionado:
– Um caminho (v0 , v1 , . . . , vk ) forma um ciclo
se v0 = vk e o caminho contém pelo
menos uma aresta.
– O ciclo é simples se os vértices
v1 , v2 , . . . , vk são distintos.
– O self-loop é um ciclo de tamanho 1.
– Dois caminhos (v0 , v1 , . . . , vk ) e
(v00 , v10 , . . . , vk0 ) formam o mesmo ciclo se
existir um inteiro j tal que vi0 = v(i+j) mod k
para i = 0, 1, . . . , k − 1.
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 9
Ciclos
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 10
Componentes Conectados
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 11
0 1 4
3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 12
Grafos Isomorfos
0 1
4 5
7 6
3 2
s w x t
v z y u
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 13
Subgrafos
• Um grafo G0 = (V 0 , A0 ) é um subgrafo de
G = (V, A) se V 0 ⊆ V e A0 ⊆ A.
0 1 4
3 2 5
1 4
2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 14
2 2
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 15
0 1 4 0 1 4
3 2 5 3 2 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.1 16
Grafos Completos
Árvores
(a) (b)
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.2 19
8. GrafoTransposto(Grafo,GrafoT): Obtém o
transposto de um grafo direcionado.
Matriz de Adjacência
0 1 4 0 1 4
3 2 5 3 2 5
0 1 2 3 4 5 0 1 2 3 4 5
0 1 1 0 1 1
1 1 1 1 1 1
2 1 1 2 1 1
3 1 3
4 4
5 5
(a) (b)
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.2.1 25
3 0 1 5
5
0 1 1 3 2 7
1
7 2
3 2 3
0 1 5
5
0 1 0 5 2 7
1
7 1 7
2
3 2
3
Busca em Profundidade
Busca em Profundidade
Busca em Profundidade -
Implementação
procedure BuscaEmProfundidade ( var Grafo : TipoGrafo ) ;
var Tempo : TipoValorTempo;
x : TipoValorVertice ;
d, t : array [ TipoValorVertice ] of TipoValorTempo;
Cor : array [ TipoValorVertice ] of TipoCor;
Antecessor : array [ TipoValorVertice ] of integer ;
begin
Tempo := 0;
for x := 0 to Grafo.NumVertices−1 do
begin Cor[ x ] : = branco ; Antecessor[ x] := −1; end;
for x := 0 to Grafo.NumVertices−1 do
i f Cor[ x ] = branco then VisitaDfs (x ) ;
end; { BuscaEmProfundidade }
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.3 45
Busca em Profundidade -
Implementação
procedure VisitaDfs (u: TipoValorVertice ) ;
var FimListaAdj : boolean;
Peso : TipoPeso;
Aux : Apontador;
v : TipoValorVertice ;
begin
Cor[u] : = cinza ; Tempo : = Tempo + 1; d[u] : = Tempo;
writeln ( ’ Visita ’ ,u:2 , ’ Tempo descoberta : ’ ,d[u]:2 , ’ cinza ’ ) ; readln;
i f not ListaAdjVazia (u, Grafo)
then begin
Aux : = PrimeiroListaAdj (u, Grafo ) ; FimListaAdj : = false ;
while not FimListaAdj do
begin
ProxAdj(u, Grafo , v , Peso, Aux, FimListaAdj ) ;
i f Cor[ v ] = branco
then begin Antecessor[ v ] : = u ; VisitaDfs (v ) ; end;
end;
end;
Cor[u] : = preto ; Tempo : = Tempo + 1; t [u] : = Tempo;
writeln ( ’ Visita ’ ,u:2 , ’ Tempo termino : ’ , t [u]:2 , ’ preto ’ ) ; readln;
end; { VisitaDfs }
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.3 46
b( / ) b( / )
b( / ) 2 3 b( / ) 2 3
(a) (b)
b( / ) b( / )
b( / ) 2 3 c(3/ ) 2 3
(c) (d)
c(1/ ) c(2/ )
0 1
b( / )
p(3/4) 2 3
(e)
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.3 47
0 1 0 1
b( / ) b( / )
p(3/4) 2 3 p(3/4) 2 3
(f) (g)
c(7/ ) p(7/8)
p(3/4) 2 3 p(3/4) 2 3
(h) (i)
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.3 48
Classificação de Arestas
• Existem:
Classificação de Arestas
3 cruz 4 cruz 5
4/5 7/8 11/12
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.3.2 51
Busca em Largura
Busca em Largura
begin
for x := 0 to Grafo.NumVertices−1 do
begin
Cor[ x ] : = branco ; Dist [ x ] : = i n f i n i t o ; Antecessor[ x] := −1;
end;
for x := 0 to Grafo.NumVertices−1 do
i f Cor[ x ] = branco then VisitaBfs (x ) ;
end; { BuscaEmLargura }
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.4 55
3 2 5 3 2 5
b( ) b( ) b( ) c(1) b( ) b( )
F 0 F 1 3
0 1 1
(c) (d)
p(0) p(1) b( ) p(0) p(1) b( )
0 1 4 0 1 4
3 2 5 3 2 5
c(1) c(2) b( ) p(1) c(2) b( )
F 3 2 F 2
1 2 2
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.4 57
3 2 5 3 2 5
p(1) p(2) b( ) p(1) p(2) b( )
F F 4
0
(g) (h)
p(0) p(1) p(0) p(0) p(1) p(0)
0 1 4 0 1 4
3 2 5 3 2 5
p(1) p(2) c(1) p(1) p(2) p(1)
F 5 F
1
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.4 58
Ordenação Topológica
Ordenação Topológica
2 4 7
3/14 6/13 8/11
9 0 5 1 2 4 6 7 8 3
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.5 62
Ordenação Topológica
Ordenação Topológica -
Implementação
0 1 0 1 0,1,2
3 2 3 2 3
2. Obtem GT .
3. Chama BuscaEmProfundidade(GT ),
realizando a busca a partir do vértice de
maior t[u] obtido na linha 1. Inicie uma nova
busca em profundidade a partir do vértice de
maior t[u] dentre os vértices restantes se
houver.
3 2 3 2 arv
cruz
4/5 3/6 7/8 2/5
1
type
TipoTempoTermino = record
t : array [ TipoValorVertice ] of TipoValorTempo;
Restantes : array [ TipoValorVertice ] of boolean;
NumRestantes: TipoValorVertice ;
end;
Function MaxTT ( var TT: TipoTempoTermino) : TipoValorVertice ;
var i , Temp: integer ;
begin
i :=0;
while not TT.Restantes[ i ] do i : = i + 1;
Temp : = TT. t [ i ] ; MaxTT : = i ;
for i := 0 to Grafo.NumVertices−1 do
i f TT.Restantes[ i ]
then i f Temp < TT. t [ i ]
then begin Temp : = TT. t [ i ] ; MaxTT : = i ; end;
end; { MaxTT }
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.6 70
• Modelagem:
– G = (V, A): grafo conectado, não
direcionado.
– V : conjunto de cidades.
– A: conjunto de possíveis conexões
– p(u, v): peso da aresta (u, v) ∈ A, custo
total de cabo para conectar u a v.
minimizado.
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.7 74
0 0
6 5
1 1
1 2 2 3 1 2 2 3
2 2
5 6 4 4 4
4 5 4 5
3 3
(a) (b)
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.7.1 75
(c) 0 (d) 0
0 0
2 2 2 2
1 3 1 3
2 2
1 1
4 5 4 4
6 4 6 4
(e) 0 (f) 0
0 0
2 2 2 2
1 3 1 3
2 2
1 1
4 5 4 5
5 4 3 4
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.7.2 80
(c) (d)
0 0
1 3 1 3
2 2
4 5 4 5
(e) (f)
0 0
1 3 1 3
2 2
4 5 4 5
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.7.3 86
• Primeiro refinamento:
procedure Kruskal ;
1. S := ∅ ;
2. for v := 0 to Grafo.NumVertices−1 do CriaConjunto ( v ) ;
3. Ordena as arestas de A pelo peso;
4. for cada ( u, v ) de A tomadas em ordem ascendente de peso do
5. i f EncontreConjunto (u) <> EncontreConjunto ( v)
then begin
6. S := S + {(u, v)} ;
7. Uniao ( u, v ) ;
end;
end;
Algoritmo de Dijkstra
Relaxamento
5 1 6 5 1 6
2 3 2 3
2 2 3
(c) 0
0
1 10
1 10
1 3 4
5 1 6
2 3
6 2 3
(a) ∅ ∞ ∞ ∞ ∞ ∞
(b) {0} 0 1 ∞ 3 10
(c) {0, 1} 0 1 6 3 10
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.8 98
5 1 6 5 1 6
2 3 2 3
5 2 3 5 2 3
(f) 0
0
1 10
1 6
1 3 4
5 1 6
2 3
5 2 3
(d) {0, 1, 3} 0 1 5 3 9
(e) {0, 1, 3, 2} 0 1 5 3 6
(f) {0, 1, 3, 2, 4} 0 1 5 3 6
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.8 99
Algoritmo de Dijkstra
begin { Dijkstra }
for u := 0 to Grafo.NumVertices do
begin {Constroi o heap com todos os valores igual a I n f i n i t o }
Antecessor[u] := −1; p[u] : = I n f i n i t o ;
A[u+1].Chave : = u ; {Heap a ser construido }
ItensHeap[u] : = true ; Pos[u] : = u+1;
end;
n : = Grafo.NumVertices ; {Tamanho do heap}
p[Raiz ] : = 0 ;
Constroi(A) ;
..
.
Projeto de Algoritmos – Cap.7 Algoritmos em Grafos – Seção 7.8 101