Você está na página 1de 61

Grafos – Algoritmos elementares

Aula 12

Fábio Henrique Viduani Martinez

Faculdade de Computação
Universidade Federal de Mato Grosso do Sul

Análise de Algoritmos

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 1 / 61


Conteúdo da aula

1 Introdução

2 Representações de grafos

3 Busca em largura

4 Busca em profundidade

5 Exercícios

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 2 / 61


Introdução

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 e matriz de adjacências

I existem duas formas de representar um grafo G = (V, E):


I como uma coleção de listas de adjacências
I como uma matriz de adjacências
I ambas as formas são aplicáveis para grafos com ou sem
orientação nas arestas
I a representação com listas de adjacências é em geral preferida,
já que fornece uma forma compacta de representar grafos
esparsos, isto é, grafos para os quais |E| é muito menor que |V|2
I a representação por matriz de adjacências pode ser mais
adequada quando o grafo é denso, isto é, quando |E| é
aproximadamente |V|2 ou quando precisamos estar aptos a dizer
rapidamente se uma aresta conecta dois vértices

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 4 / 61


Representações de grafos

Listas de adjacências

As listas de adjacências de um grafo G = (V, E) consistem de um vetor


Adj de |V| listas, uma para cada vértice em V. Para cada u ∈ V, a lista
de adjacências Adj[u] contém todos os vértices v tais que existe uma
aresta uv ∈ E.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 5 / 61


Representações de grafos

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

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 6 / 61


Representações de grafos

Listas de adjacências

1 2 4
1 2 3
2 5
3 6 5
4 2
4 5 6 5 4
6 6

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 7 / 61


Representações de grafos

Propriedades das listas de adjacências

I se G é um grafo orientado, a soma dos comprimentos de todas as


listas de adjacências é |E|
I se G é um grafo (sem orientação nas arestas), a soma dos
comprimentos das suas listas de adjacências é 2|E|
I a representação de um grafo por listas de adjacências tem a
propriedade que a quantidade de memória necessária é Θ(V + E)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 8 / 61


Representações de grafos

Propriedades gerais

I na determinação do tempo de execução de um algoritmo que usa


um grafo G = (V, E), usamos em geral como medida do tamanho
da entrada o número de vértices |V| e o número de arestas |E| do
grafo
I no interior de notações assintóticas, o símbolo V significa |V|,
assim como E significa |E|; ou seja, adotamos a notação O(VE) no
lugar de O(|V||E|)
I nos algoritmos, adotamos a notação G.V para o conjunto de
vértices do grafo G e G.E para o conjunto de arestas de G

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 9 / 61


Representações de grafos

Propriedades das listas de adjacências

I a representação de um grafo por listas de adjacências pode ser


facilmente adaptada para representar grafos com pesos nas
arestas, ou seja, grafos para os quais cada aresta tem um peso
associado, dado pela função peso w : G.E → Q
I por exemplo, seja G = (V, E) um grafo com pesos com função peso
w; o peso w(uv) de uma aresta uv ∈ G.E pode ser armazenado
com o vértice v na lista de adjacências de u
I uma desvantagem potencial da representação por listas de
adjacências é que não há uma maneira rápida de determinar se
uma dada aresta uv está presente no grafo

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 10 / 61


Representações de grafos

Matriz de adjacências

Para a matriz de adjacências de um grafo G = (V, E), consideramos


que os vértices são numerados com 1, 2, . . . , |V| de maneira arbitrária.
Então, a representação de um grafo G por uma matriz de adjacências
consiste de uma matriz A = (ai j ) de dimensões |V| × |V| tal que

1, se i j ∈ G.E ,
(
ai j =
0, caso contrário .

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 11 / 61


Representações de grafos

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

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 12 / 61


Representações de grafos

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

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 13 / 61


Representações de grafos

Propriedades da matriz de adjacências

I a matriz de adjacências A de um grafo (sem orientação nas


arestas) é idêntica à sua transposta, isto é, A = AT
I a representação de um grafo G por uma matriz de adjacências A
também pode ser usada para representar grafos com pesos nas
arestas, armazenando o peso w(uv) de uma aresta uv ∈ G.E na
entrada auv de A

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 14 / 61


Busca em largura

Ideia geral

I um dos algoritmos mais simples para busca em um grafo e a base


para diversos outros algoritmos importantes para grafos
I dado um grafo G = (V, E) e um vértice s de G chamado origem, a
busca em largura (breadth-first search – BFS) explora
sistematicamente as arestas de G para “descobrir” todo vértice
que é alcançável a partir de s
I BFS computa a distância (o menor número de arestas) de s a
cada vértice alcançável a partir de s
I BFS produz uma “árvore da busca em largura” (ou árvore BFS)
com raiz s e que contém todos os vértices alcançáveis
I para cada vértice v alcançável por s, o caminho na árvore BFS de
s a v corresponde ao “menor caminho” de s a v em G

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 15 / 61


Busca em largura

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

I BFS constrói uma árvore BFS, inicialmente contendo apenas sua


raiz, que é o vértice origem s
I sempre que um vértice branco v é descoberto durante o percurso
de uma lista de adjacências de um vértice u já descoberto, o
vértice v e a aresta uv são adicionados à árvore
I nesse caso, dizemos que u é o predecessor ou pai de v na árvore
BFS

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 17 / 61


Busca em largura

Ideia geral

I o algoritmo BFS recebe um grafo de entrada G = (V, E)


representado por listas de adjacências
I a cor de um vértice u é armazenada em u.color
I o predecessor de u é armazenado em u.π; se u não tem
predecessor, então u.π = nil
I a distância da origem s ao vértice u computada pelo algoritmo é
armazenada em u.d
I o algoritmo BFS usa uma fila Q para gerenciar os vértices de cor
cinza

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 18 / 61


Busca em largura

Algoritmo da busca em largura


BFS(G, s)
01. para cada vértice u ∈ G.V − s
02. u.color = branco
03. u.d = ∞
04. u.π = nil
05. s.color = cinza
06. s.d = 0
07. s.π = nil
08. Q=∅
09. Entra-na-Fila(Q, s)
10. enquanto Q , ∅
11. u = Sai-da-Fila(Q)
12. para cada v ∈ Adj[u]
13. se v.color == branco
14. v.color = cinza
15. v.d = u.d + 1
16. v.π = u
17. Entra-na-Fila(Q, v)
18. u.color = preto

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 19 / 61


Busca em largura

Exemplo de execução

r s t u

v w x y

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 20 / 61


Busca em largura

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 21 / 61


Busca em largura

Análise do algoritmo BFS

I depois da inicialização, nenhum vértice é colorido com branco


desse momento em diante
I o teste na linha 13 assegura que cada vértice é enfileirado no
máximo uma vez e, portanto, desenfileirado no máximo uma vez
I operações de enfileiramento e desenfileiramento têm tempo de
execução O(1)
I o tempo total para operações na fila é O(V)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 22 / 61


Busca em largura

Análise do algoritmo BFS

I como a lista de adjacências de cada vértice é percorrida somente


quando o vértice sai da fila, então cada lista de adjacências é
percorrida no máximo uma vez
I como a soma dos comprimentos de todas as listas de
adjacências é Θ(E), então o tempo total gasto no percurso das
listas de adjacências é O(E)
I o tempo de inicialização é O(V) e assim o tempo total de
execução do algoritmo BFS é O(V + E)
I portanto, o algoritmo BFS tem tempo de execução linear no
tamanho da representação por listas de adjacências de G

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 23 / 61


Busca em largura

Propriedades da busca em largura

I a distância dist(s, v) de s a v em um grafo G é definida como o


menor número de arestas em qualquer caminho de s a v em G
I se não existe um caminho de s a v em G então dist(s, v) = ∞
I o caminho de comprimento dist(s, v) de s a v em G é chamado um
menor caminho de s a v
I o algoritmo BFS encontra corretamente as distâncias para cada
vértice v ∈ G.V

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 24 / 61


Busca em largura

Árvore da busca em largura

I o algoritmo BFS constrói uma árvore BFS


I a árvore BFS é representada pelo atributo π em cada vértice
I para um grafo G = (V, E) com origem s, definimos o subgrafo
predecessor de G como Gπ = (Vπ , Eπ ) onde

Vπ = {v ∈ V : v.π , nil} ∪ {s}

e
Eπ = {(v.π, v) : v ∈ Vπ − s}

I o subgrafo predecessor Gπ é uma árvore BFS se Vπ consiste dos


vértices alcançáveis a partir de s e existe um único caminho de s
a v em Gπ , para todo v ∈ Vπ , que é um menor caminho de s a v
em G

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 25 / 61


Busca em largura

Menor caminho

o algoritmo PrintPath imprime os vértices de um menor caminho de s


a v, assumindo que o algoritmo BFS foi executado e computou a
árvore BFS

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

Tempo de execução: O(V)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 26 / 61


Busca em profundidade

Ideia geral

I na busca em profundidade (depth-first search), o vértice v mais


recentemente descoberto tem exploradas as arestas incidentes a
v e ainda não exploradas
I quando todas as arestas incidentes a v são exploradas, a busca
volta a explorar as arestas incidentes no vértice a partir do qual o
vértice v foi descoberto
I se existem vértices não descobertos, então um deles é
selecionado e a busca é repetida a partir dele
I o processo como um todo é repetido até que todos os vértices
sejam descobertos

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 27 / 61


Busca em profundidade

Ideia geral

I como na busca em largura, sempre que um vértice v é


descoberto durante o percurso na lista de adjacências de um
vértice já descoberto u, a busca em profundidade registra esse
evento fazendo com que o predecessor de v.π de v seja u
I o subgrafo predecessor produzido por uma busca em
profundidade pode ser composto por várias árvores
I o subgrafo predecessor de uma busca em profundidade é definido
então como Gπ = (V, Eπ ) onde Eπ = {(v.π, v) : v ∈ V e v.π , nil}
I o subgrafo predecessor de uma busca em profundidade produz
uma floresta de busca em profundidade composta de várias
árvores de busca em profundidade

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 28 / 61


Busca em profundidade

Ideia geral

I os vértices são coloridos durante a busca em profundidade, para


indicar seu estado: cada vértice é inicialmente branco, torna-se
cinza quando é descoberto na busca e torna-se preto quando é
finalizado
I a busca em profundidade também rotula cada vértice com duas
marcas de tempo: v.d armazena o momento quando v é
descoberto (e é colorido com cinza) e v. f registra o momento
quando a busca termina de examinar a lista de adjacências de v
(e é colorido com preto)
I as marcas de tempo são valores entre 1 e 2|V|
I observe que u.d < u. f para todo vértice u
I u é branco antes de u.d, cinza entre u.d e u. f e preto depois de u. f

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 29 / 61


Busca em profundidade

Ideia geral

I a entrada do algoritmo DFS de busca em profundidade é um


grafo G, orientado ou não orientado
I a variável tempo é uma variável global usada para registro dos
tempos

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 30 / 61


Busca em profundidade

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)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 31 / 61


Busca em profundidade

Algoritmo da busca em profundidade

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

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 32 / 61


Busca em profundidade

Exemplo de execução

u v w

x y z

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 33 / 61


Busca em profundidade

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 34 / 61


Busca em profundidade

Análise do algoritmo DFS

I as estruturas de repetição das linhas 1-3 e 5-7 do algoritmo DFS


têm tempo de execução Θ(V), desconsiderando a chamada ao
algoritmo DFS-Visit
I o algoritmo DFS-Visit é executado exatamente uma vez para
cada vértice v ∈ V
I no algoritmo DFS-Visit, a estrutura de repetição nas linhas 3-6 é
executada |Adj[v]| vezes
I como X
|Adj[v]| = Θ(E)
v∈V

então o custo total da execução das linhas 3-6 do algoritmo


DFS-Visit é Θ(E)
I portanto, o tempo de execução do algoritmo DFS é Θ(V + E)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 35 / 61


Busca em profundidade

Ordenação topológica

I seja G um grafo com orientação nas arestas e acíclico (dag –


directed acyclic graph)
I a ordenação topológica de um dag G = (V, E) é uma ordenação
linear de todos os seus vértices tal que, se G tem uma aresta uv,
então u precede v nessa ordenação
I uma ordenação topológica de um grafo pode ser vista como uma
ordenação de seus vértices ao longo de uma linha horizontal, tal
que todas as arestas orientadas vão da esquerda para direita

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 36 / 61


Busca em profundidade

Ordenação topológica

I dags são usados em muitas aplicações que indicam precedências


entre eventos: escalonamento de uma sequência de tarefas com
precedências, escalonamento de instruções, síntese lógica,
serialização de dados, etc

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 37 / 61


Busca em profundidade

Ordenação topológica

I um exemplo ilustrativo é dado a seguir, que surge todos os dias


pela manhã quando o professor X se veste para o trabalho

cueca meias

relogio

calcas sapatos

camisa

cinto

gravata

jaqueta

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 38 / 61


Busca em profundidade

Ordenação topológica

I professor X deve vestir certos itens de vestuário antes de outros


I outros itens podem ser vestidos em qualquer ordem
I uma aresta orientada uv no dag indica que o item u deve ser
vestido antes do item v
I uma ordenação topológica desse dag fornece uma ordem de
itens para a qual o professor X pode vestir-se seguramente

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 39 / 61


Busca em profundidade

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

Tempo de execução: Θ(V + E)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 40 / 61


Busca em profundidade

Ordenação topológica

meias cueca calcas sapatos relogio camisa cinto gravata jaqueta

17/18 11/16 12/15 13/14 9/10 1/8 6/7 2/5 3/4

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 41 / 61


Busca em profundidade

Componentes fortemente conexos

I a decomposição de um grafo com orientação nas arestas em


seus componentes fortemente conexos é uma aplicação clássica
da busca em profundidade
I um componente fortemente conexo de um grafo orientado
G = (V, E) é um conjunto maximal de vértices C ⊆ V tal que, para
todo par de vértices u e v em C, temos que existem caminhos de
u a v e de v a u em G

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 42 / 61


Busca em profundidade

Componentes fortemente conexos

a b c d

e f g h

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 43 / 61


Busca em profundidade

Componentes fortemente conexos

I seja G = (V, E) um grafo; o grafo transposto GT = (V, ET ) de G é tal


que ET = {uv : vu ∈ E}
I ou seja, ET consiste das arestas de G com suas orientações
invertidas
I dada uma representação de G por listas de adjacências,
podemos obter GT em tempo O(V + E)
I G e GT têm exatamente os mesmos componentes fortemente
conexos

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 44 / 61


Busca em profundidade

Componentes fortemente conexos

a b c d

e f g h

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 45 / 61


Busca em profundidade

Componentes fortemente conexos

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

Tempo de execução: Θ(V + E)

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 46 / 61


Busca em profundidade

Componentes fortemente conexos

a b c d

e f g h

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 47 / 61


Busca em profundidade

Exemplo de execução

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 48 / 61


Exercícios

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.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 49 / 61


Exercícios

Exercícios

22.1-3 O grafo transposto de um grafo orientado G = (V, E) é o grafo GT = (V, ET ), onde


ET = {vu ∈ V × V : uv ∈ E}. Assim GT é G com todas as suas arestas invertidas.
Descreva algoritmos eficientes para computar o grafo transposto GT de um grafo
orientado G, com G representado por uma lista de adjacências e por uma matriz
de adjacências. Analise o tempo de execução de seus algoritmos.
22.1-5 O quadrado de um grafo orientado G = (V, E) é o grafo G2 = (V, E2 ) tal que uw ∈ E2
se e somente se para algum v ∈ V, ambas uv ∈ E e vw ∈ E. Ou seja, G2 contém
uma aresta entre u e w sempre que G contém um caminho com exatamente
duas arestas entre u e w. Descreva algoritmos eficientes para computar G2 de G
onde G é representado por uma lista de adjacências e por uma matriz de
adjacências. Analise os tempos de execução dos seus algoritmos.
22.1-6 Quando uma representação por uma matriz de adjacências é usada, muitos
algoritmos para grafos precisam de tempo Θ(V 2 ), mas existem algumas
exceções. Mostre como determinar se um grafo orientado contém uma destino
universal — um vértice com grau de entrada |V| − 1 e grau de saída 0 — em
tempo O(V), dada uma representação por matriz de adjacências para G.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 50 / 61


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

−1 , se a aresta j sai do vértice i ,





bij =  1, se a aresta j entra no vértice i ,


 0, caso contrário .

Descreva o que representam as entradas da matriz BBT , onde BT é a transposta


de B.
22.2-1 Mostre os valores de d e π que resultam da execução do algoritmo BFS sobre o
grafo orientado da figura 1, usando o vértice 3 como origem.
1 2 3

4 5 6

Figura: Grafo do exercício 22.2-1.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 51 / 61


Exercícios

Exercícios

22.2-2 Mostre os valores de d e π que resultam da execução do algoritmo BFS sobre o


grafo da figura 2, usando o vértice u como origem.

r s t u

v w x y

Figura: Grafo do exercício 22.2-2.

22.2-4 Qual é o tempo de execução do algoritmo BFS se representamos seu grafo de


entrada por uma matriz de adjacências e modificamos o algoritmo para
manipular esta forma de entrada?

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 52 / 61


Exercícios

Exercícios

22.2-5 Argumente que na busca em largura, o valor u.d atribuído ao vértice u é


independente da ordem em que os vértices aparecem em cada lista de
adjacências. Mostre, por outro lado, que a árvore BFS construída pelo algoritmo
BFS pode depender da ordem dos vértices nas listas de adjacências.
22.2-7 Há dois tipos de pugilistas profissionais: bebezões (“caras bonzinhos”) e vilões
(“caras maus”). Entre qualquer par de pugilistas profissionais, pode ou não
existir uma rivalidade. Suponha que temos n pugilistas profissionais e temos
também uma lista de r pares de pugilistas para os quais existem rivalidades.
Forneça um algoritmo de tempo O(n + r) que determina se é possível apontar
alguns dos pugilistas como bebezões e o restante como vilões, de tal forma que
cada rivalidade existente seja entre um bebezão e um vilão. Se é possível obter
essa designação, seu algoritmo deve produzi-la.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 53 / 61


Exercícios

Exercícios

22.3-1 Uma busca em profundidade classifica as arestas de um grafo como:


I arestas da árvore são as arestas da floresta Gπ . Uma aresta uv é uma aresta da
árvore se v foi descoberto primeiro quando o algoritmo explora a aresta uv;
I arestas retorno são as arestas uv que conectam um vértice u a um ancestral v em
uma árvore de busca em profundidade. Laços em grafos orientados são
considerados arestas retorno;
I arestas adiante são arestas uv que não fazem parte da árvore que conectam um
vértice u a um descendente v na árvore de busca em profundidade;
I arestas cruzadas são todas as outras arestas. Ela podem conectar vértices na
mesma árvore de busca em profundidade, enquanto um vértice não é ancestral do
outro, ou podem conectar vértices de diferentes árvores de busca em profundidade.
Faça uma tabela 3-por-3 com rotúlos branco, cinza e preto. Em cada compartimento (i, j)
indique, em qualquer momento durante a busca em profundidade em um grafo orientado,
se pode existir uma aresta de um vértice de cor i para um vértice de cor j. Para cada
aresta possível, indique de qual tipo essa aresta pode ser. Faça uma outra tabela para
uma busca em profundidade de um grafo não orientado.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 54 / 61


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

Figura: Grafo dos exercícios 22.3-2 e 22.5-2.

22.3-7 Reescreva o algoritmo DFS usando uma pilha para eliminar a recursão.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 55 / 61


Exercícios

Exercícios

22.3-8 Forneça um contra-exemplo para a conjectura que se um grafo orientado G


contém um caminho de u a v e se u.d < v.d em uma busca em profundidade de
G, então v é um descendente de u na floresta da busca em profundidade
produzida.
22.3-9 Forneça um contra-exemplo para a conjectura que se um grafo orientado G
contém um caminho de u a v, então qualquer busca em profundidade deve
resultar em v.d < u. f .
22.3-11 Explique como um vértice u de um grafo orientado pode ser finalizado em uma
busca em profundidade contendo somente u, mesmo que existam arestas
entrando e saindo de u em G.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 56 / 61


Exercícios

Exercícios

22.3-12 Um subgrafo de um grafo G é qualquer grafo H tal que VH ⊆ VG e EH ⊆ EG . É conveniente


escrever “H ⊆ G” para dizer que H é subgrafo de G. Em qualquer grafo G, dizemos que um
vértice v está ligado a um vértice w se G contém um caminho com extremos v e w. Um
grafo é conexo se seus vértices são ligados dois a dois. Um subgrafo conexo H de um
grafo G é maximal (com relação à propriedade de ser conexo) se não faz parte de um
subgrafo conexo maior, ou seja, se H não é subgrafo próprio de algum subgrafo conexo de
G, ou seja, se não existe grafo conexo H0 tal que H ⊂ H0 ⊆ G. Um componente de um
grafo G é qualquer subgrafo conexo maximal de G.
Mostre que podemos usar a busca em profundidade sobre um grafo G não orientado para
identificar os componentes conexos de G e que a floresta da busca em profundidade
contém tantas árvores quanto G possui componentes conexos. Mais precisamente,
mostre como modificar a busca em profundidade de tal forma que ela atribua a cada
vértice v um rótulo v.cc, que é um número inteiro entre 1 e k, onde k é o número de
componentes conexos de G, tal que u.cc = v.cc se e somente se u e v pertencem ao
mesmo componente conexo.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 57 / 61


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

Figura: Grafo do exercício 22.4-1.

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.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 58 / 61


Exercícios

Exercícios

22.4-3 Forneça um algoritmo que determina se um grafo não orientado G = (V, E)


contém um circuito. Seu algoritmo deve ter tempo O(V), independente de |E|.
22.4-5 Outra forma de executar uma ordenação topológica sobre um dag G = (V, E) é
repetidamente encontrar um vértice de grau 0, imprimi-lo e removê-lo
juntamente com as arestas que saem dele. Explique como implementar essa
ideia com tempo de execução O(V + E). O que acontece com este algoritmo se
o grafo G tem circuitos?
22.5-1 Como o número de componentes fortemente conexos de um grafo pode se
modificar se uma nova aresta é adicionada?

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 59 / 61


Exercícios

Exercícios

22.5-2 Mostre como o algoritmo StronglyConnectedComponents se comporta sobre o


grafo da figura 3. Especificamente, mostre os tempos de término computados
na linha 1 e a floresta produzida na linha 3. Assuma que a estrutura de
repetição das linhas 5–7 do algoritmo DFS considera os vértices em ordem
alfabética e que as listas de adjacências estão em ordem alfabética.
22.5-3 O professor Grushteniak afirma que o algoritmo para componentes fortemente
conexos seria mais simples se usasse o grafo original, ao invés do grafo
transposto, na segunda busca em profundidade e percorresse os vértices em
ordem crescente de seus tempos de término. Este algoritmo mais simples
sempre produz resultados corretos?

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 60 / 61


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.

(a) Prove que em uma busca em largura de um grafo não orientado, as


seguintes propriedades valem:
(1) Não existem arestas retorno e arestas adiante;
(2) Para cada aresta da árvore uv, temos que v.d = u.d + 1;
(3) Para cada aresta cruzada uv, temos que v.d = u.d ou v.d = u.d + 1.
(b) Prove que em uma busca em largura de um grafo orientado, as
seguintes propriedades valem:
(1) Não existem arestas adiante;
(2) Para cada aresta da árvore uv, temos que v.d = u.d + 1;
(3) Para cada aresta cruzada uv, temos que v.d 6 u.d + 1;
(4) Para cada aresta retorno uv, temos que 0 6 v.d 6 u.d.

Viduani Martinez (FACOM) Grafos – Algoritmos elementares AA 61 / 61

Você também pode gostar