Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 12
Faculdade de Computação
Universidade Federal de Mato Grosso do Sul
Análise de Algoritmos
1 Introdução
2 Representações de grafos
3 Busca em largura
4 Busca em profundidade
5 Exercícios
Motivação
I grafos são estruturas de dados amplamente usadas em
computação e algoritmos que trabalham com grafos são
fundamentais na área
I esta aula apresenta métodos para representação de um grafo e
para busca em um grafo
I busca em um grafo significa visitar sistematicamente as arestas
do grafo, bem como os seus vértices
I um algoritmo que realiza uma busca em um grafo pode descobrir
muito sobre sua estrutura
I muitos algoritmos começam por realizar uma busca em seu grafo
de entrada com o objetivo de obter essa informação estrutural
I outros algoritmos são descritos como re-elaborações simples de
algoritmos que realizam buscas em grafos
I técnicas de busca em grafos são o coração da área de algoritmos
para grafos
Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 3 / 61
Representações de grafos
Listas de adjacências
Listas de adjacências
1 2 5
1 2
2 1 5 3 4
3 3 2 4
4 2 5 3
5 4 5 4 1 2
Listas de adjacências
1 2 4
1 2 3
2 5
3 6 5
4 2
4 5 6 5 4
6 6
Propriedades gerais
Matriz de adjacências
1, se i j ∈ G.E ,
(
ai j =
0, caso contrário .
Matriz de adjacências
1 2 3 4 5
1 0 1 0 0 1
1 2
2 1 0 1 1 1
3 3 0 1 0 1 0
4 0 1 1 0 1
5 4 5 1 1 0 1 0
Matriz de adjacências
1 2 3 4 5 6
1 0 1 0 1 0 0
1 2 3
2 0 0 0 0 1 0
3 0 0 0 0 1 1
4 0 1 0 0 0 0
4 5 6 5 0 0 0 1 0 0
6 0 0 0 0 0 1
Ideia geral
Ideia geral
I o algoritmo da busca em largura funciona para grafos não
orientados e orientados
I o nome “busca em largura” se refere à forma como o algoritmo
BFS expande uniformente a fronteira entre os vértices
descobertos e não descobertos
I ou seja, o algoritmo descobre todos os vértices à distância k de s
antes de descobrir qualquer vértice à distância k + 1
I O algoritmo BFS pinta os vértices de branco, cinza e preto
durante sua execução
I todos os vértices iniciam com cor branca; um vértice é
descoberto a primeira vez que é encontrado durante a execução
do algoritmo, momento em que troca de cor
I vértices de cor cinza representam a fronteira entre os vértices
descobertos e não descobertos
Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 16 / 61
Busca em largura
Ideia geral
Ideia geral
Exemplo de execução
r s t u
v w x y
Exemplo de execução
e
Eπ = {(v.π, v) : v ∈ Vπ − s}
Menor caminho
PrintPath(G, s, v)
01. se v == s
02. imprime s
03. senão
04. se v.π == nil
05. imprime “não há caminho de” s “a” v
06. senão
07. Print-Path(G, s, v.π)
08. imprime v
Ideia geral
Ideia geral
Ideia geral
Ideia geral
Busca em profundidade
DFS(G)
01. para cada vértice u ∈ G.V
02. u.color = branco
03. u.π = nil
04. tempo = 0
05. para cada vértice u ∈ G.V
06. se u.color == branco
07. DFS-Visit(u)
DFS-Visit(u)
01. u.color = cinza
02. u.d = tempo = tempo + 1
03. para cada v ∈ Adj[u]
04. se v.color == branco
05. v.π = u
06. DFS-Visit(v)
07. u.color = preto
08. u. f = tempo = tempo + 1
Exemplo de execução
u v w
x y z
Exemplo de execução
Ordenação topológica
Ordenação topológica
Ordenação topológica
cueca meias
relogio
calcas sapatos
camisa
cinto
gravata
jaqueta
Ordenação topológica
Ordenação topológica
TopologicalSort(G)
01. chame DFS(G) para computar os tempos de término v. f para cada vértice v
02. assim que cada vértice é finalizado, insira-o no início de uma lista ligada
03. devolva a lista ligada de vértices
Ordenação topológica
a b c d
e f g h
a b c d
e f g h
StronglyConnectedComponents(G)
01. chame DFS(G) para computar os tempos de término u. f para cada vértice u
02. compute GT
03. chame DFS(GT ), mas no laço principal do DFS considere os vértices
em ordem decrescente de u. f , como computado na linha 1
04. devolva os vértices de cada árvore na floresta de busca em profundidade
formada na linha 3 como um componente fortemente conexo separado
a b c d
e f g h
Exemplo de execução
Exercícios
22.1-1 Dado um grafo orientado G = (V, E), os pares ordenados de vértices em E são
chamados de arestas ou arcos. Um arco uv em E, também denotado por uv, ~ sai
do vértice u e entra no vértice v. O grau de entrada u.d− de um vértice u em V é
o número de arcos entrando em u, isto é, o número de arcos do tipo vu, para v
um vértice de G. O grau de saída u.d+ de um vértice u em V é o número de
arcos saindo de u, isto é, o número de arcos do tipo uv, para v um vértice de G.
Dada uma representação por listas de adjacências de um grafo orientado, qual
o tempo gasto para computar o grau de saída de cada vértice deste grafo? E
para computar o grau de entrada de cada vértice?
22.1-2 Forneça uma representação por listas de adjacências para uma árvore binária
completa com 7 vértices. Forneça uma representação equivalente por uma
matriz de adjacências. Considere que os vértices são númerados de 1 a 7 como
em um heap.
Exercícios
Exercícios
22.1-7 A matriz de incidências de um grafo orientado G = (V, E) sem laços é uma matriz
B = (bi j ) de dimensões |V| × |E| tal que
4 5 6
Exercícios
r s t u
v w x y
Exercícios
Exercícios
Exercícios
22.3-2 Execute o algoritmo DFS sobre o grafo da figura 3. Assuma que a estrutura de
repetição para das linhas 5-7 do algoritmo DFS considera os vértices em
ordem alfabética e que cada lista de adjacências é ordenada alfabeticamente.
Mostre os tempos de descoberta e término de cada vértice bem como a
classificação de cada aresta.
r
q
s t u
v w x y
22.3-7 Reescreva o algoritmo DFS usando uma pilha para eliminar a recursão.
Exercícios
Exercícios
Exercícios
22.4-1 Mostre a ordem dos vértices produzida pelo algoritmo TopologicalSort quando
executado sobre o dag da figura 4.
m n o p
q r s
t u v w
x y z
22.4-2 Forneça um algoritmo de tempo linear que toma como entrada um dag G = (V, E)
e dois vértices s e t e devolve o número de caminhos de s a t em G. Por
exemplo, o dag da figura 4 contém exatamente quatro caminhos do vértice p ao
vértice v: pov, poryv, posryv e psryv. Seu algoritmo precisa apenas contar o
número de caminhos, não listá-los.
Exercícios
Exercícios
Problemas
22-1 Classificação das arestas pela busca em largura
Uma floresta de busca em profundidade classifica as arestas de um grafo em
aresta da árvore, aresta retorno, aresta adiante e aresta cruzada. Uma
busca em largura pode também ser usada para classificar as arestas alcaçadas
a partir do vértice origem da busca nas mesmas quatro categorias.