Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 4
Algoritmos de Busca em Grafos
2 5
1 3 6
4
Definições
O seguinte grafo é uma árvore?
0: 5,1
0 5 6 7
•
• 1: 0,2,3,4
2: 1
1 2 8
•
• 3: 1 3
• 4: 1 4
• 5: 0 Uma floresta é um conjunto de árvores
• 6: 7,8 sem vértices em comum
• 7: 6 Uma floresta é um grafo cujos
• 8: 6 componentes conexos são árvores
Definições
0 5 6 7
1 2 8
0 5 6 7
11 12
13 8
1 2
14 15
3
0 5 6 7
11 12
13 8
1 2
14 15
3
4
Busca em Largura
b c
f g h k
m n p q r
Grafo de entrada
Busca em Largura
b c
f g h k
m n p q r
Grafo de entrada
Busca em Largura
1 0
b c
3 4 5
f g h k
2
m n p q r
10 6 7 8 9
Grafo de entrada
Busca em Largura
c
1 0
b c b h
3 4 5
f g h k f g k
2
n p q r
m n p q r
10 6 7 8 9
m
Fila
Pilha
Busca em Profundidade
Inicialmente {s}
b c
d e f g
h i j k
Busca em Grafos
a a
b c b c
d e f g d e f g
h i j k h i j k
2 5
1 3 6
4
Busca em Profundidade
Pilha
2 5
1 3 6
Origem s = 4
4
0
Pilha
2 5 1
1 3 6
4
0
Busca em Profundidade
2
Pilha
2 2 5 1
1 3 6
4
0
Busca em Profundidade
7 7
2
Pilha
2 2 5 1
1 3 6
4
0
Busca em Profundidade
3/4
2
Pilha
2 2 5 1
1 3 6
4
0
Busca em Profundidade
3/4
7 5
5 2
Pilha
2 2 5 1
1 3 6
4
0
Busca em Profundidade
3/4 3
7 5
5 2
Pilha
2 2 5 1
1 3 6
1 6
4
0
Busca em Profundidade
6
3/4 3
7 5
5 2
Pilha
2 2 5 1
1 3 6
1 6 7
4
0
Busca em Profundidade
3/4 3
7 5
5 2
Pilha
2 2 5 1
1 3 6
1 6 7/8
4
0
Busca em Profundidade
3/4
7 5
5 2
Pilha
2 2 5 1
1 3 6
1 6/9 7/8
4
0
Busca em Profundidade
3/4
5/10 2
Pilha
2 2 5 1
1 3 6
1 6/9 7/8
4
0
Busca em Profundidade
3/4
5/10
Pilha
2/11 2 5 1
1 3 6
1 6/9 7/8
4
0
Busca em Profundidade
3/4
5/10
Pilha
2/11 2 5
1 3 6
4
0
Busca em Profundidade
3/4
5/10
Pilha = {}
2/11 2 5
1 3 6
4
0/13
Algoritmo
• Constantes:
BRANCO, CINZA, PRETO, INFINITO
• Variáveis:
P (Pilha) , s (vértice de origem)
• Propriedades do vértice v:
v.cor (cor do vértice)
v.t1 (ordem de visita inicial do vértice v) – Tempo de descoberta
v.t2 (ordem de visita final do vértice v) – Tempo de Término
• Funções :
Insere(P, v), permite inserir o vértice v na pilha P
Remove(P), permite remover um vértice da pilha P
Consulta(P), permite consultar o último vértice na pilha P
Algoritmo
DFS(G,s):
Para cada vértice v em G.V-{s} faça
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
s.cor = CINZA
s.t1 = 0
P = VAZIO
Insere(P,s)
P = {4}
7
2 5
1 3 6
4
0
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)
2 5 2 5
1 3 6 1 3 6
1
4 4
0 0
Inicialização Iteração 1
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P)
Pilha = {4,1,2}
7
2 5
2
1 3 6
1
4
0 Iteração 2
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P) 3 Pilha = {4,1,2,7}
7
2 5
2
1 3 6
1
4
0 Iteração 3
Algoritmo
Enquanto P VAZIO faça Percorre o grafo
u = Consulta(P)
Se u tem vértices adjacentes na cor BRANCO
v = escolhe um vértice adjacente v.cor = BRANCO
v.cor = CINZA
tempo = tempo + 1
v.t1 = tempo
Insere(P,v)
Caso-contrário
u.cor = PRETO
tempo = tempo + 1
v.t2 = tempo
Remove(P) 3/4 Pilha = {4,1,2}
7
2 5
2
1 3 6
1
4
0 Iteração 4 ...
Busca em Profundidade
O algoritmo anterior pode ser transformado a
uma versão RECURSIVA
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7
2 5
s=4
1 3 6
tempo = 0
4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo+1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7
2 5
s=4
1 3 6
tempo = 0
4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7
2 5
s=4
1 3 6
tempo = 0
4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7
v=1
2 5
s=4
1 3 6
tempo = 0
4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo
7
v=1
2 5
s=4
1 3 6
tempo = 0
4
0
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7
2 5
2
s=7
1 3 6
tempo = 3
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7
2 5
2
s=7
1 3 6
tempo = 3
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3
7
2 5
2
s=7
1 3 6
tempo = 4
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5
2
s=7
1 3 6
tempo = 4
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5
2
s=7
1 3 6
tempo = 4
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5
2
s=5
1 3 6
tempo = 4
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5
2
s=5
1 3 6
tempo = 5
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5 5
2
s=5
1 3 6
tempo = 4
1
4
Após algumas chamadas 0
recursivas...
Algoritmo (Recursivo)
VisitaDFS(G,s):
tempo = tempo + 1 Percorre o grafo
s.t1 = tempo
s.cor = CINZA
Para cada v em G.Adj[s] faça
Se v.cor == BRANCO
VisitaDFS(G,v)
s.cor = PRETO
tempo = tempo + 1
s.t2 = tempo 3/4
7
2 5 5
2
s=5
1 3 6
tempo = 5
1
4
Após algumas chamadas 0
recursivas...
Grafos Direcionados
Grafos Direcionados
Grafos Direcionados
Algoritmo (Recursivo)
// Esta função permite percorrer os elementos do grafo, começando em s
DFS(G,s):
Para cada vértice v em G.V-{s} faça Inicialização
v.cor = BRANCO
v.t1 = INFINITO
v.t2 = INFINITO
tempo = 0
VisitaDFS(G,s)
Grafo não-direcionado
Exemplo
Grafo direcionado
Exemplo
• Algoritmo
1. Faça uma busca em profundidade
v w
Exemplo 3
BCC
BMat
PI NI
CR BExp Optat
TQui
Obrig
Exemplo 3
BCC
BMat 1
PI NI
CR BExp Optat
TQui
Obrig
Exemplo 3
BCC
BMat 1
PI NI 2
CR BExp Optat
TQui
Obrig
Exemplo 3
BCC
BMat 1
PI NI 2/3
CR BExp Optat
TQui
Obrig
Exemplo 3
BCC
BMat 1/4
PI NI 2/3
CR BExp Optat
TQui
Obrig
Exemplo 3
5 BCC
BMat 1/4
PI NI 2/3
CR BExp Optat
TQui
Obrig
Exemplo 3
5 BCC
BMat 1/4
6 PI NI 2/3
CR BExp Optat
TQui
Obrig
Exemplo 3
5 BCC
BMat 1/4
6 PI NI 2/3
7 CR BExp Optat
TQui
Obrig
Exemplo 3
5 BCC
BMat 1/4
6 PI NI 2/3
7 CR BExp Optat
TQui
Obrig 8
Exemplo 3
5 BCC
BMat 1/4
6 PI NI 2/3
7 CR BExp Optat
TQui
Obrig 8/9
Exemplo 3
5 BCC
BMat 1/4
6 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5 BCC
BMat 1/4
6/11 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui 16
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui 16/17
Obrig 8/9
Exemplo 3
5/12 BCC
BMat 1/4
6/11 PI NI 2/3
TQui 16/17
Grafo G é acíclico
se e somente se a busca em profundidade em G não
apresentar arestas de retorno
Em termos de algoritmo
verificar se um vértice w adjacente a v possuir cor cinza na
primeira vez que o arco(v, w) é percorrido
Teste Grafo Cíclico/Acíclico
Exemplo
Árvore de Profundidade
Exemplo
Árvore de Profundidade
Exemplo
Árvore de Profundidade
Exemplo
Árvore de Profundidade
GRAFO CÍCLICO
Eliminação de Vértices
O algoritmo descrito originalmente
por Kahn tem a seguinte estratégia:
Passo 1: Encontrar os vértices com grau de entrada zero e
os inserir em uma fila
Ao menos um vértice desses deve existir se o grafo é acíclico
Passo 2: Selecionar um dos vértices e remover todos os
seus arcos de saída
Partindo do princípio que, se esses vértices e seus arcos de saída
forem removidos, o grafo remanescente é também um grafo
direcionado acíclico
O vértice removido deve ser inserido na fila
Passo 3: Repetir os Passos 1 e 2
Exemplo
Fila
Simulação
https://www.cs.usfca.edu/~galles/visualization/DFS.html
Bibliografia
Capítulos 1 e 3 Capítulo 22
Atividade
• Para os grafos G e H abaixo, execute a busca em
profundidade a partir do vértice 1:
(a) Dando preferência para vértices de menor índice
(b) Dando preferência para vértices de maior índice
G H